Android 進程保活分為如下兩種情況:
- 提高進程優先級,降低進程被殺死的概率
- 在進程被殺死后,進行拉活
進程的優先級分為5級:
1.前臺進程-------Foreground process 只有在內存不足以支持它們同時繼續運行這一萬不得已的情況下,系統才會終止它們。
A. 界面上顯示的,用戶正在交互的 Activity(已調用 onResume())
B. 某個 Service,綁定到用戶正在交互的 Activity
C. 調用了 startForeground()正在運行的service
D. 正執行一個生命周期回調的 Service(onCreate()、onStart() 或onDestroy())
E.正執行其 onReceive() 方法的 BroadcastReceiver
2.可見進程 —— Visible process 可見進程被視為是極其重要的進程,除非為了維持所有前臺進程同時運行而必須終止,否則系統不會終止這些進程。
A. 不在前臺、但仍對用戶可見的 Activity(已調用 onPause())。
B. 綁定到可見(或前臺)Activity 的 Service
3.服務進程 —— Service process
后臺運行的服務如播放音樂 下載數據。
4,.后臺進程 —— Background process
用戶不可見的activity
5.空進程-------Empty process 一般做緩存
進程優先級1為最高 最不容易被系統殺死,1像素?;罹褪窃诔绦蛲顺龊髮⑦M程優先級提高 減少被系統殺死的幾率,奉上例子。
一個像素?;罾?/h2>
講一個像素?;钸M程的前。先說怎么現實一個像素的Activity
1) 實現一個像素的Activity
1.創建MainActivity類。主界面
package com.zsj.keepliveprocess;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener {
private Button btn_onePixel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_onePixel = (Button) findViewById(R.id.onepixel);
btn_onePixel.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// 跳轉到一個像素的Activity
Intent intent = new Intent(this, KeepLiveActivity.class);
startActivity(intent);
//Finish自己
finish();
}
}
2.創建一個像素的Activity--KeepLiveActivity
package com.zsj.keepliveprocess;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
public class KeepLiveActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Activity是依附在Window上的
Window window = getWindow();
// 把這個一個像素點設置在左上角。
window.setGravity(Gravity.LEFT | Gravity.TOP);
// 設置一個像素
LayoutParams params = new LayoutParams();
params.width = 1;
params.height = 1;
window.setAttributes(params);
}
}
3.給KeepLiveActivity設置透明主題
運行后。能看到下面的內容。但是不能點擊。因為你點擊的一個像素的Activity。
背景:當手機鎖屏的時候什么都干死了,為了省電。
我們實現的保活是當手機滅屏。啟動一個像素的Activity。把我們的進程提升成前臺進程。這樣才不會被系統輕易殺死。
當亮屏的時候。finish一個像素的Activity(可以順便啟動核心服務)。這樣用戶就不會輕易發現我們偷偷啟動了一個像素的進程。
2) 實現一個像素?;钸M程的栗子:
1.啟動一個主界面MainActivity。啟動一個后臺服務。
package com.zsj.keepliveprocess;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//啟動一個后臺服務
Intent intent = new Intent(this, ScreenService.class);
startService(intent);
}
}
2.后臺服務ScreenService。監聽亮屏,滅屏的情況做啟動或者殺死一個像素的Activity
package com.zsj.keepliveprocess;
import com.zsj.keepliveprocess.ScreenListener.ScreenStateListener;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class ScreenService extends Service {
public void onCreate() {
super.onCreate();
new ScreenListener(this).begin(new ScreenStateListener() {
@Override
public void onScreenOn() {
// 亮屏,finish一個像素的Activity
KeepLiveActivityManager.getInstance(ScreenService.this)
.finishKeepLiveActivity();
}
@Override
public void onScreenOff() {
// 滅屏,啟動一個像素的Activity
KeepLiveActivityManager.getInstance(ScreenService.this)
.startKeepLiveActivity();
}
});
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
3.起一個監聽ScreenStateListener來監聽屏幕的亮屏和滅屏。監聽屏幕亮屏和滅屏有廣播。所以內部封裝了一個廣播接收者。又因為屏幕亮屏和滅屏是很頻繁的廣播。必須動態在代碼注冊。
package com.zsj.keepliveprocess;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
public class ScreenListener {
private ScreenStateListener mScreenStateListener;
private Context mContext;
private ScreenBroadcastReceiver mScreenReceiver;
public ScreenListener(Context context) {
this.mContext = context;
mScreenReceiver = new ScreenBroadcastReceiver();
}
public void begin(ScreenStateListener listener) {
this.mScreenStateListener = listener;
//屏幕亮滅屏廣播
registerResceiver();
}
private void registerResceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
mContext.registerReceiver(mScreenReceiver, filter);
}
interface ScreenStateListener {
void onScreenOn();
void onScreenOff();
}
/**
* screen狀態廣播接收者
*/
private class ScreenBroadcastReceiver extends BroadcastReceiver {
private String action = null;
@Override
public void onReceive(Context context, Intent intent) {
action = intent.getAction();
if (Intent.ACTION_SCREEN_ON.equals(action)) { // 開屏
mScreenStateListener.onScreenOn();
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) { // 鎖屏
mScreenStateListener.onScreenOff();
}
}
}
}
4.另一還有管理類KeepLiveActivityManager是控制開啟或者關閉一個像素的Activity的。
package com.zsj.keepliveprocess;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
public class KeepLiveActivityManager {
private static KeepLiveActivityManager instance;
private Context mContext;
private Activity mKeepLiveActivity;
public KeepLiveActivityManager(Context context) {
this.mContext = context;
}
public static KeepLiveActivityManager getInstance(Context context) {
if (instance == null) {
instance = new KeepLiveActivityManager(
context.getApplicationContext());
}
return instance;
}
public void setKeepLiveActivity(Activity keepliveActivity) {
this.mKeepLiveActivity = keepliveActivity;
}
public void finishKeepLiveActivity() {
mKeepLiveActivity.finish();
}
public void startKeepLiveActivity() {
Intent intent = new Intent(mContext, KeepLiveActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
}
5.一個像素的Activity。
package com.zsj.keepliveprocess;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
public class KeepLiveActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("zsj", "keepLiveAcitivity onCreate()");
// Activity是依附在Window上的
Window window = getWindow();
// 把這個一個像素點設置在左上角。
window.setGravity(Gravity.LEFT | Gravity.TOP);
// 設置一個像素
LayoutParams params = new LayoutParams();
params.width = 1;
params.height = 1;
window.setAttributes(params);
KeepLiveActivityManager.getInstance(this).setKeepLiveActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("zsj", "keepLiveAcitivity onDestroy()");
}
}
詳細下載Demo:
https://github.com/zsj1225/onePixelDemo