您的位置:首页 > 移动开发

Anroid5.0以上进程保活方案(亲测可自行调起被杀死的app)

2018-03-15 14:06 351 查看
实验了几种最后选择了2中组合
第一种
开启一像素activity保活,如果2个activity同时被杀死则此方案不可选。
第二种
发送null的notification 提高进程优先级像酷狗音乐的通知栏一样  强制推出还是被杀死
第三种
jobservice  jobsheduler 的使用native来唤醒 该方案在强制杀死app进程之后会拉起新的app进程
最后选择 2,3来进行保活。
简单介绍jobservice
jobservice种有2个抽象方法 onstartjob(),onstopjob() 调用该service需要权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<service android:name=".MyJobService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE"
/>
onstopjob()在调用jobfinish()后调用。当杀死进程的时候会调用onstartjob()方法,这时我们 可以在logcat中看到日志。或者在onstartjob()中toast一些文字。但是不可以进行耗时操作。缺点耗电。
我的service(亲测可自行调起被杀死的app)

/**
 * Created by sunxx on 2018/3/13.
 */
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class MyJobService extends JobService {

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("cvca","启动onStartCommand");
        startJobSheduler();
        return START_STICKY;
    }

    public void startJobSheduler() {
        try {
JobInfo.Builder builder = new JobInfo.Builder(1, new ComponentName(getPackageName(), MyJobService.class.getName()));
            //这个方法只能保证在设置的这段时间内,任务最多执行一次
            builder.setPeriodic(100);
            //设备重启之后你的任务是否还要继续执行
            builder.setPersisted(true);
            JobScheduler jobScheduler = (JobScheduler) this.getSystemService(Context.JOB_SCHEDULER_SERVICE);
            jobScheduler.schedule(builder.build());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    @Override
    public boolean onStartJob(JobParameters params) {
        boolean isLocalServiceWork = isServiceWork(this, "com.mapbar.test.savelife.TestServce");
        if (isLocalServiceWork){
            Log.i("cvca","on");
        }else{
            Log.i("cvca","off");
            Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.aa.test.savelife");
            startActivity(LaunchIntent);
        }
      Toast.makeText(this,"ok",Toast.LENGTH_SHORT).show();
        if (isLocalServiceWork){
            Log.i("cvca","on");
        }else{
            Log.i("cvca","off");
        }
        return true;
    }
    @Override
    public boolean onStopJob(JobParameters params) {
        Log.i("cvca","onStopJob检测");
        return true;
    }
    // 判断服务是否正在运行
    public boolean isServiceWork(Context mContext, String serviceName) {
        boolean isWork = false;
        ActivityManager myAM = (ActivityManager) mContext
                .getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningServiceInfo> myList = myAM.getRunningServices(100);
        if (myList.size() <= 0) {
            return false;
        }
        for (int i = 0; i < myList.size(); i++) {
            String mName = myList.get(i).service.getClassName().toString();
            if (mName.equals(serviceName)) {
                isWork = true;
                break;
            }
        }
        return isWork;
    }
}

详细内容请看http://blog.csdn.net/u013263323/article/details/56285475
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: