Android优化笔记--Service优化

         service 是一个后台服务  专门用来处理常驻后台的工作的组件,经常会被用在及时通讯,通知等场景。 它的优化主要体现在两个方面:1.服务的保活,2.服务后台对于执行任务的集中管理.

进程的重要性优先级
  1 前台进程 Foreground process
         1 用户正在交互的Activity(onResume)
         2 当某个Service绑定正在交互Activity
         3 被主动调用为前台Service(startForeground)
         4 组件正在执行生命周期的回调
         5 BrocastReceiver 正在执行onReceive()               
   2 可见进程 Visible process
         1我们 的Activity处在onPause()
         2 绑定到前台Activity的Service 
   3 服务进程  Service process
            statService() 启动
  4 后台进程 Background process
         对用户没有直接影响的进程    Activity  处于 onStop的时候
            android:process=":xxx"
  5 空进程 Empty process
      不含有任何活动的组件  android设计 第二次启动更快

如何提升进程的优先级,主要是为了减少被系统杀掉的概率。

1. 提高进程优先级,一般是通过减少进程oom_adj值,如启动进程的setForeground()提高进程优先级

2. java层双进程守护,在应用启动的时候,开启两个进程的服务,一个用来执行业务,一个用来监控业务服务,一旦被系统干掉,就立即重启业务服务,需要注意的是,业务服务的一些状态的保存,以及再次重启后状态如何恢复的处理。

3.1个像素的Activity保活,监控锁屏广播,在锁屏的时候启动一个 1个像素Activity  解锁后  结束这个Activity 重启服务。

4. JobScheduler轮询

import android.app.ActivityManager;
import android.app.Service;
import android.app.job.JobInfo;
import android.app.job.JobParameters;
import android.app.job.JobScheduler;
import android.app.job.JobService;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

import java.util.List;

public class JobHandleService extends JobService {
    private int kJobId =0;
    public static String TAG=  "LJT";

    public JobHandleService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate: ");
    }

    @Override
    public boolean onStartJob(JobParameters params) {
        boolean serviceLocalWork = isServiceWork(this, "com.ljt.servicemanager.LocalService");
        boolean serviceRemoteWork = isServiceWork(this, "com.ljt.servicemanager.RemoteService");
		Log.i(TAG, "localSericeWork:"+serviceLocalWork);
		Log.i(TAG, "remoteSericeWork:"+serviceRemoteWork);
		if(!serviceLocalWork || ! serviceRemoteWork) {
            this.startService(new Intent(this,LocalService.class));
            this.startService(new Intent(this,RemoteService.class));
            Toast.makeText(this, " JobService process start", Toast.LENGTH_SHORT).show();
        }
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        Log.i(TAG, "onStopJob:");
        scheduleJob(getJobInfo());
        return true;
    }

    public void scheduleJob(JobInfo t) {
        Log.i(TAG, "scheduleJob:");
        JobScheduler tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
        tm.schedule(t);
    }

    public JobInfo getJobInfo() {
        JobInfo.Builder builder = new JobInfo.Builder(kJobId++, new ComponentName(this, JobHandleService.class));
        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
        builder.setPersisted(true);
        builder.setRequiresCharging(false);
        builder.setRequiresDeviceIdle(false);
        builder.setPeriodic(10); // 间隔时间--周期
        return builder.build();
    }

    //判断某个服务是否正在运行的方法
    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;
    }
}

5.native层双进程守护
6 无限播放音乐;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章