1. 程式人生 > >android保活程序總結--雙程序保活策略

android保活程序總結--雙程序保活策略

程序的保活,在很多資訊類的App和即時通訊App的用處很大,奈何谷歌的推送服務在國內是被閹割了!據說是在8.0(奧利奧)相關政府機構已經將開放這項功能提上了日程,嗯,沒錯8.0,預計再過三五年就可以像蘋果那樣自由自在的推送了!但是一點不雞凍,不知道我這禿頭的碼農還能不能捱到,哈哈!

先看看效果圖:

這裡寫圖片描述

這張圖片的主要操作是殺死後臺所有的應用程序,之後在狀態列上面彈出被拉起來的程!

測試機引數:

這裡寫圖片描述

service:是一個後臺服務,專門用來處理常駐後臺的工作的元件。

一、優先順序

程序的重要性優先順序:(越往後的就越容易被系統殺死)
1.前臺程序;Foreground process
1)使用者正在互動的Activity(onResume())
2)當某個Service繫結正在互動的Activity。
3)被主動呼叫為前臺Service(startForeground())
4)元件正在執行生命週期的回撥(onCreate()/onStart()/onDestroy())
5)BroadcastReceiver 正在執行onReceive();

2.可見程序;Visible process
1)我們的Activity處在onPause()(沒有進入onStop())
2)繫結到前臺Activity的Service。

3.服務程序;Service process
簡單的startService()啟動。
4.後臺程序;Background process
對使用者沒有直接影響的程序—-Activity出於onStop()的時候。
android:process=”:xxx”
5.空程序; Empty process
不含有任何的活動的元件。(android設計的,為了第二次啟動更快,採取的一個權衡)

好了,基礎知識回顧的差不多了!進入正題吧!

事先宣告哈!其實是沒有真正的程序的保活的,在手動殺死後臺的時候,執行在系統後臺的所有程序都是一一被殺死的,注意的是,一個一個被殺死的,所以我們才利用這個特性來做的!額。。中心思想即是,在應用被開啟的時候,啟動兩個後臺服務,這兩個後臺服務是相互依存的,也就是說,當一個程序被幹掉的時候,另一個存活的程序就立馬將其拉起喚醒,也就是打一個時間差!

嗯,上程式碼!

遠端服務程式碼:

import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import
android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.os.RemoteException; import android.support.v4.app.NotificationCompat; import android.util.Log; import android.widget.Toast; public class RemoteService extends Service { public static final String TAG = "tianchuangxin"; private MyBinder binder; private MyServiceConnection conn; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return binder; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); if(binder ==null){ binder = new MyBinder(); } conn = new MyServiceConnection(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { RemoteService.this.bindService(new Intent(RemoteService.this, LocalService.class), conn, Context.BIND_IMPORTANT); PendingIntent contentIntent = PendingIntent.getService(this, 0, intent, 0); NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setTicker("XXX") .setContentIntent(contentIntent) .setContentTitle("我是XXX,我怕誰!") .setAutoCancel(true) .setContentText("哈哈") .setWhen( System.currentTimeMillis()); //把service設定為前臺執行,避免手機系統自動殺掉改服務。 startForeground(startId, builder.build()); return START_STICKY; } class MyBinder extends RemoteConnection.Stub{ @Override public String getProcessName() throws RemoteException { // TODO Auto-generated method stub return "LocalService"; } } class MyServiceConnection implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.i(TAG, "建立連線成功!"); } @Override public void onServiceDisconnected(ComponentName name) { Log.i(TAG, "LocalService服務被幹掉了~~~~斷開連線!"); Toast.makeText(RemoteService.this, "斷開連線", 0).show(); //啟動被幹掉的 RemoteService.this.startService(new Intent(RemoteService.this, LocalService.class)); RemoteService.this.bindService(new Intent(RemoteService.this, LocalService.class), conn, Context.BIND_IMPORTANT); } } }

本地服務程式碼:

import com.dn.keepliveprocess.RemoteService.MyBinder;
import com.dn.keepliveprocess.RemoteService.MyServiceConnection;

import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;

public class LocalService extends Service {

    public static final String TAG = "tianchaungxin";
    private MyBinder binder;
    private MyServiceConnection conn;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return binder;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        if(binder ==null){
            binder = new MyBinder();
        }
        conn = new MyServiceConnection();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        LocalService.this.bindService(new Intent(LocalService.this, RemoteService.class), conn, Context.BIND_IMPORTANT);

        PendingIntent contentIntent = PendingIntent.getService(this, 0, intent, 0);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setTicker("XXX")
        .setContentIntent(contentIntent)
        .setContentTitle("我是XXX,我怕誰!")
        .setAutoCancel(true)
        .setContentText("哈哈")
        .setWhen( System.currentTimeMillis());

        //把service設定為前臺執行,避免手機系統自動殺掉改服務。
        startForeground(startId, builder.build());
        return START_STICKY;
    }


    class MyBinder extends RemoteConnection.Stub{

        @Override
        public String getProcessName() throws RemoteException {
            // TODO Auto-generated method stub
            return "LocalService";
        }

    }

    class MyServiceConnection implements ServiceConnection{

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i(TAG, "建立連線成功!");

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i(TAG, "RemoteService服務被幹掉了~~~~斷開連線!");
            Toast.makeText(LocalService.this, "斷開連線", 0).show();
            //啟動被幹掉的
            LocalService.this.startService(new Intent(LocalService.this, RemoteService.class));
            LocalService.this.bindService(new Intent(LocalService.this, RemoteService.class), conn, Context.BIND_IMPORTANT);
        }

    }


}

JobService保證在息屏後,CPU進入休眠狀態時進行喚醒

import java.util.List;

import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
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.util.Log;
import android.widget.Toast;

@SuppressLint("NewApi")
public class JobHandleService extends JobService{
    private int kJobId = 0;
    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("tianchuangxin", "jobService create");

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("tianchuangxin", "jobService start");
        scheduleJob(getJobInfo());
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }

    @Override
    public boolean onStartJob(JobParameters params) {
        // TODO Auto-generated method stub
        Log.i("tianchuangxin", "job start");
//      scheduleJob(getJobInfo());
        boolean isLocalServiceWork = isServiceWork(this, 你的本地服務ref----XXXX.LocalService);
        boolean isRemoteServiceWork = isServiceWork(this, 你的遠端服務ref----XXXX.RemoteService);
//      Log.i("INFO", "localSericeWork:"+isLocalServiceWork);
//      Log.i("INFO", "remoteSericeWork:"+isRemoteServiceWork);
        if(!isLocalServiceWork||
           !isRemoteServiceWork){
            this.startService(new Intent(this,LocalService.class));
            this.startService(new Intent(this,RemoteService.class));
            Toast.makeText(this, "process start", Toast.LENGTH_SHORT).show();
        }
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        Log.i("tianchuangxin", "job stop");
//      Toast.makeText(this, "process stop", Toast.LENGTH_SHORT).show();
        scheduleJob(getJobInfo());
        return true;
    }

    /** Send job to the JobScheduler. */
    public void scheduleJob(JobInfo t) {
        Log.i("tianchuangxin", "Scheduling job");
        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();
    }


    /** 
     * 判斷某個服務是否正在執行的方法 
     *  
     * @param mContext 
     * @param serviceName 
     *            是包名+服務的類名(例如:net.loonggg.testbackstage.TestService) 
     * @return true代表正在執行,false代表服務沒有正在執行 
     */  
    public boolean isServiceWork(Context mContext, String serviceName) {  
        boolean isWork = false;  
        ActivityManager myAM = (ActivityManager) mContext  
                .getSystemService(Context.ACTIVITY_SERVICE);  
        List<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;  
    }  
}

AIDL定義


interface RemoteConnection{
    String getProcessName();
}

我們再在MainActivity中進行呼叫:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        startService(new Intent(this, LocalService.class));
        startService(new Intent(this, RemoteService.class));
        startService(new Intent(this, JobHandleService.class));
    }

OK,所有程式碼基本在這了!哈哈!有問題的話留言交流!

每天進步一點點,時間會讓你成為巨人!

相關推薦

android程序總結--程序策略

程序的保活,在很多資訊類的App和即時通訊App的用處很大,奈何谷歌的推送服務在國內是被閹割了!據說是在8.0(奧利奧)相關政府機構已經將開放這項功能提上了日程,嗯,沒錯8.0,預計再過三五年就可以像蘋果那樣自由自在的推送了!但是一點不雞凍,不知道我這禿頭的碼農

安卓應用實踐(程序守護)

         研究安卓應用保活黑科技已經有一段時間了,其實很多都是看看文章,部落格,看完就忘了,今天休息,在家寫寫Demo,研究一下,跟大家分享。 學習資料:http://www.oschina.

Android程序守護service

package com.guardservice; import com.guardservice.aidl.GuardAidl; import android.app.Notification; import android.app.PendingIntent; import android.app.Se

Android中的程序(不死程序

Android中的程序保活方式主要分為以下三種: 黑色保活:不同的app程序,用廣播相互喚醒(包括利用系統提供的廣播進行喚醒) 白色保活:啟動前臺Service 灰色保活:利用系統的漏洞啟動前臺Service 黑色保活 利用不同的app程序使用廣播來進

Android程序回收機制和方案

1 Low Memory Killer機制 在Android系統中,程序的生命週期都是由系統來控制的。出於體驗和效能上的考慮,即使對一個App進行Home鍵還是Back鍵退出的操作,系統並不會真正殺掉該App的程序,它的程序依然存在於記憶體之中。因為這樣在下次要啟動這個App時就能更加快速。

android程序-前臺server+畫素

借鑑部分 背景:從產品的角度來說,任何一個應用程式的PM都希望自己的應用程式在使用者手機中的留存率高些些,之前我接觸到的一個業務需求也是如此,要求提升應用程式在國內第三方廠商ROM中的存活率。 如前篇所述踩坑篇,保活策略只在android原生系統中起作用,在國內第三方廠商R

程序守護APP方案

探討一種新型的雙程序守護應用保活方法(轉載請宣告出處:http://blog.csdn.net/andrexpert/article/details/53485360)        情景再現:“在高版本Android系統中,應用能否常駐記憶體,我想一直以來都是某些APP頭疼

安卓開發之使用程序守護和程序提權來實現服務程序

一、程序保活 在 如何讓我們的Android應用程序保活? 文章裡總結了一些程序保活方法,本文以雙程序守護和程序提權來保活我們的服務程序。 雙程序守護: 主要設計AB兩個不同服務程序,A程序的服務輪詢檢查B程序的服務是否存活,沒存活的話將其拉起,

Android後臺機制,應用程序長存的可行性分析

什麼時候會造成STOPPED狀態: 重未啟動過的應用,原生的系統中,當應用初次啟動後就會被標識為非STOPPED狀態,而且再也沒有機會被打回原形除非重新安裝應用;但是一些定製系統,在清理應用時加入了將應用重置為STOPPED的邏輯。 與系統Service捆綁 Android系統提供給我們一系列的

Android程序總結一:生成多程序(android:process屬性)

前言 正常情況下,一個apk啟動後只會執行在一個程序中,其程序名為apk的包名,所有的元件都會在這個程序中執行,以下為DDMS的程序截圖: com.biyou.multiprocess為程序名,也是apk的包名,  但是如果需要將某些元件(如Service,Activity等)執行在單

Android進階——效能優化之程序原理及手段完全解析(二)

引言 上一篇文章Android進階——效能優化之程序保活原理及手段完全解析(一)總結了Android程序和執行緒的相關知識,主要介紹了幾種提升程序優先順序的手段,通常僅僅是提高優先順序只能讓你的程序存活時間久一點,但是真正的被殺死之後就不會自動拉活的,如果你的程

Android NDK(C++) 程序守護

雙程序守護如果從程序管理器觀察會發現新浪微博、支付寶和QQ等都有兩個以上相關程序,其中一個就是守護程序,由此可以猜到這些商業級的軟體都採用了雙程序守護的辦法。 什麼是雙程序守護呢?顧名思義就是兩個程序互相監視對方,發現對方掛掉就立刻重啟!不知道應該把這樣的一對程序是叫做相依為命呢還是難兄難弟好呢,但總之

Android實現程序守護

如何保證Service不被Kill (1)onStartCommand方法,返回START_STICKY @Override public int onStartCommand(Intent intent, int flags, int star

android 使用Service進行程序守護,防止程序被殺

public class MyService extends Service { String msg; public MyService() { msg = "Msg from MyService"; } @Override public IBind

Android程序保護實現的思考及過程說明

採用雙程序的方式,對父程序進行保護,基於訊號的傳送和接收,實現相互的保護防止被動態攻擊。 雙程序程序保護主要功能: 1、保護父程序,ptrace所有執行緒,防止被附加、除錯、暫停; 2、保護子程序,防止被暫停、異常退出; 對應說明圖: 不足之處與修

Android NDK程序守護(Socket)

NDK雙程序守護(單工機制) 最近在系統的學習Android NDK開發於是想著把剛學完的一個知識點總結寫一篇部落格,就是我今天要說的NDK程序守護。目前市面上的應用,貌似除了微信和手Q都會比較擔心被使用者或者系統(廠商)殺死的問題。而最近學的雙程序守護就能很

Android 程序守護

前言   最近有在專案中用到高德的定位SDK,功能是每隔一定的時間獲取一次使用者的地理位置,採取的方案是在後臺開啟一個 Service,監聽高德地圖的位置變化。   該功能在使用者手機螢幕亮時完美實現,但是當螢幕被關閉的時候,位置資訊卻無法被獲取了,

android程序、守護程序的實現及程序

1,概念 1)守護程序(Daemon) 是一種執行在後臺的特殊程序,它獨立於控制終端並且週期性的執行某些任務。android中守護程序的實現主要由Service來完成。Android繼承了Linux的lowmemorykiller,為了實現程序常駐,需要應用到守護程序。

關於微信小程序獲取小程序碼並接受buffer流存為圖片

pty serial 微信小程序開發 isp dir 找到 head sts ner 前言 昨天因為小程序功能要獲取小程序程序碼,看了微信文檔爬了好多坑。(留一下記錄以防後面被坑) 操作 因為我獲取到了微信那裏的圖片的圖片流一直不知道怎麽處理,今天總算找到相關

BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第6章節--在SharePoint2013中開發、集成和構建應用程序 總結

epo pos pop mod data 基礎上 註入 代碼 enter BEGINNING SHAREPOINT? 2013 DEVELOPMENT 第6章節--在SharePoint2013中開發、集成和構建應用程序 總結 SharePoint開發