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像素保活就是在程序退出后将进程优先级提高 减少被系统杀死的几率,奉上例子。
一个像素保活例子
讲一个像素保活进程的前。先说怎么现实一个像素的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) 实现一个像素保活进程的栗子:
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