首先要說的是,用戶可能把這種作法視爲流氓軟件。大部分時候,程序員也不想把軟件作成流氓軟件,沒辦法,領導說了算。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
- package com.arui.framework.android.daemonservice;
-
- import android.app.AlarmManager;
- import android.app.PendingIntent;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.os.SystemClock;
-
- public class BootBroadcast extends BroadcastReceiver {
-
- @Override
- public void onReceive(Context context, Intent mintent) {
-
- if (Intent.ACTION_BOOT_COMPLETED.equals(mintent.getAction())) {
- // 啓動完成
- Intent intent = new Intent(context, Alarmreceiver.class);
- intent.setAction("arui.alarm.action");
- PendingIntent sender = PendingIntent.getBroadcast(context, 0,
- intent, 0);
- long firstime = SystemClock.elapsedRealtime();
- AlarmManager am = (AlarmManager) context
- .getSystemService(Context.ALARM_SERVICE);
-
- // 10秒一個週期,不停的發送廣播
- am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstime,
- 10 * 1000, sender);
- }
-
- }
- }
- package com.arui.framework.android.daemonservice;
-
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
-
- public class Alarmreceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
-
- if (intent.getAction().equals("arui.alarm.action")) {
- Intent i = new Intent();
- i.setClass(context, DaemonService.class);
- // 啓動service
- // 屢次調用startService並不會啓動多個service 而是會屢次調用onStart
- context.startService(i);
- }
- }
- }
- package com.arui.framework.android.daemonservice;
-
- import android.app.Service;
- import android.content.Intent;
- import android.os.IBinder;
- import android.util.Log;
-
- public class DaemonService extends Service {
-
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- Log.v("=========", "***** DaemonService *****: onCreate");
- }
-
- @Override
- public void onStart(Intent intent, int startId) {
- Log.v("=========", "***** DaemonService *****: onStart");
- // 這裏能夠作Service該作的事
- }
- }
下面是manifest文件的代碼。spa
- <receiver
- android:name="com.arui.framework.android.daemonservice.BootBroadcast"
- android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
- <intent-filter>
- <action android:name="android.intent.action.BOOT_COMPLETED" />
- </intent-filter>
- </receiver>
- <receiver
- android:name="com.arui.framework.android.daemonservice.Alarmreceiver" >
- <intent-filter>
- <action android:name="arui.alarm.action" />
- </intent-filter>
- </receiver>
- <service
- android:name="com.arui.framework.android.daemonservice.DaemonService" >
- </service>
繼續討論這個問題。.net
若是用戶中止整個應用(在管理應用程序中中止應用,或者第三方軟件中止整個應用),此時整個進程被殺死,全部的服務天然也被殺死了,timmer,或者alarmManager也就中止了。此時就不會再按期啓動服務了。
那麼,怎麼才能作到,用戶或者第三方軟件沒法中止整個應用呢。咱們能夠再註冊一個系統級別的監聽(BroadcastReceiver),來監聽系統級別的消息,再次啓動timmer,或者alarmManager。這樣,即便應用被殺死了,隔一段時間,應用還會自動啓動。具體的,就不在這裏展開了。
---------------------------------------------------------------------------
GL(arui319)
http://blog.csdn.net/arui319
<本文能夠轉載,可是請保留以上做者信息。謝謝。>
---------------------------------------------------------------------------