Android中如何作到Service被關閉後又自動啓動

首先要說的是,用戶可能把這種作法視爲流氓軟件。大部分時候,程序員也不想把軟件作成流氓軟件,沒辦法,領導說了算。javascript

 

咱們在使用某些Android應用的時候,可能會發現安裝了某應用之後,會有一些服務也會隨之運行。並且,這些服務每次都會隨着手機開機而啓動。有的服務作的更絕,當用戶在運行的服務中手動中止該服務之後,過了一段時間,服務又自動運行了。雖然,從用戶的角度來講,這種方式比較流氓。可是,從程序員的角度來講,這是如何作到的呢?通過研究,我發現有一種方式是能夠實現的。下面就和你們分享。java

 

先簡單介紹,一下子會貼上所有代碼。android

 

如何作到開機啓動?程序員

 

這個比較簡單,網上的資料夠多,只要實現一個BroadcastReceiver,監聽手機啓動完成的事件ACTION_BOOT_COMPLETED便可。須要注意的是,好像不能用模擬器,要用手機測試。app

 

那如何作到啓動一個Service,而且在用戶關閉後能自動又啓動了呢?ide

 

通常的,都會在上面說到的BroadcastReceiver的實現裏面,監聽手機啓動完成後,啓動一個Service,這是通常的作法。問題是,用戶可以在服務裏看到這個Service是常駐的。若是用戶很敏感,就會中止該Service,甚至直接卸載掉相關的應用。那麼,怎樣才能按期實現某功能,又不讓用戶直接看到這個Service呢?聰明的你必定當即就想到了,若是不直接啓動Service,而是啓動一個timmer,或者alarmManager,而後每隔一段時間去啓動Service,作完事情之後關閉掉Service就能夠了。測試

 

 

仍是看下面的所有代碼吧,不過多解釋了。這些代碼中仍是有很多概念的,不熟悉AlarmManager、PendingIntent、BroadcastReceiver、Service等等這些概念的同窗能夠百度一下。ui

 

  1. package com.arui.framework.android.daemonservice;  
  2.   
  3. import android.app.AlarmManager;  
  4. import android.app.PendingIntent;  
  5. import android.content.BroadcastReceiver;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.os.SystemClock;  
  9.   
  10. public class BootBroadcast extends BroadcastReceiver {  
  11.   
  12.     @Override  
  13.     public void onReceive(Context context, Intent mintent) {  
  14.   
  15.         if (Intent.ACTION_BOOT_COMPLETED.equals(mintent.getAction())) {  
  16.             // 啓動完成  
  17.             Intent intent = new Intent(context, Alarmreceiver.class);  
  18.             intent.setAction("arui.alarm.action");  
  19.             PendingIntent sender = PendingIntent.getBroadcast(context, 0,  
  20.                     intent, 0);  
  21.             long firstime = SystemClock.elapsedRealtime();  
  22.             AlarmManager am = (AlarmManager) context  
  23.                     .getSystemService(Context.ALARM_SERVICE);  
  24.   
  25.             // 10秒一個週期,不停的發送廣播  
  26.             am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstime,  
  27.                     10 * 1000, sender);  
  28.         }  
  29.   
  30.     }  
  31. }  


 

  1. package com.arui.framework.android.daemonservice;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6.   
  7. public class Alarmreceiver extends BroadcastReceiver {  
  8.     @Override  
  9.     public void onReceive(Context context, Intent intent) {  
  10.   
  11.         if (intent.getAction().equals("arui.alarm.action")) {  
  12.             Intent i = new Intent();  
  13.             i.setClass(context, DaemonService.class);  
  14.             // 啓動service   
  15.             // 屢次調用startService並不會啓動多個service 而是會屢次調用onStart  
  16.             context.startService(i);  
  17.         }  
  18.     }  
  19. }  


 

  1. package com.arui.framework.android.daemonservice;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.IBinder;  
  6. import android.util.Log;  
  7.   
  8. public class DaemonService extends Service {  
  9.   
  10.     @Override  
  11.     public IBinder onBind(Intent intent) {  
  12.         return null;  
  13.     }  
  14.   
  15.     @Override  
  16.     public void onCreate() {  
  17.         super.onCreate();  
  18.         Log.v("=========""***** DaemonService *****: onCreate");  
  19.     }  
  20.   
  21.     @Override  
  22.     public void onStart(Intent intent, int startId) {  
  23.         Log.v("=========""***** DaemonService *****: onStart");  
  24.         // 這裏能夠作Service該作的事  
  25.     }  
  26. }  


 

下面是manifest文件的代碼。spa

 

  1. <receiver   
  2.     android:name="com.arui.framework.android.daemonservice.BootBroadcast"  
  3.     android:permission="android.permission.RECEIVE_BOOT_COMPLETED">  
  4.     <intent-filter>  
  5.         <action android:name="android.intent.action.BOOT_COMPLETED" />  
  6.     </intent-filter>  
  7. </receiver>  
  8. <receiver   
  9.     android:name="com.arui.framework.android.daemonservice.Alarmreceiver" >  
  10.     <intent-filter>  
  11.         <action android:name="arui.alarm.action" />  
  12.     </intent-filter>  
  13. </receiver>  
  14.       <service  
  15.           android:name="com.arui.framework.android.daemonservice.DaemonService" >  
  16.       </service>  



 繼續討論這個問題。.net

若是用戶中止整個應用(在管理應用程序中中止應用,或者第三方軟件中止整個應用),此時整個進程被殺死,全部的服務天然也被殺死了,timmer,或者alarmManager也就中止了。此時就不會再按期啓動服務了。

那麼,怎麼才能作到,用戶或者第三方軟件沒法中止整個應用呢。咱們能夠再註冊一個系統級別的監聽(BroadcastReceiver),來監聽系統級別的消息,再次啓動timmer,或者alarmManager。這樣,即便應用被殺死了,隔一段時間,應用還會自動啓動。具體的,就不在這裏展開了。

 

---------------------------------------------------------------------------

GL(arui319)

http://blog.csdn.net/arui319

<本文能夠轉載,可是請保留以上做者信息。謝謝。>

---------------------------------------------------------------------------

 

 

相關文章
相關標籤/搜索