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 無限播放音樂;

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