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