笔者在这里就不多说了,因为一般人们都不喜欢这样的东西,尤其是有洁癖的人更是如此,总是喜欢时不时的杀进程杀服务,可是由于android开源的特殊性,你会发现被干掉的服务又一次的重新复活了,总之生命力极其强悍,业界称之为——打不死的小强。
对于用户也许这个小强很是讨厌,可是对于开发者来说,由于需求,不得不做一个小强(是不是说俺们程序猿也是很讨厌啊。。呜呜。。)
废话不多说,小强的做法有很多种,像主流的微信、QQ等都是启动两个服务,两个服务之间相互监听,一个被干掉,另外一个会立即启动被干掉的这个,由于服务在Android的“地位”最高,所以服务中的监听会优先执行。这就是QQ、微信的做法。
在这里我用的是自己的做法,做法与他们原理相同,不过我是设置了一个定时器,如果服务被干掉,服务会在指定的时间后重启。这个时间你来定,是不是很爽啊,要是定的时间很小,哈哈,恭喜你,你制作了一个病毒,由于服务会一直启动,会使你的机子卡死。。。。。。
首先,自己做一个Service
public class MyService extends Service {
/**
* 定时器
*/
private AlarmManager mAlarmManager = null;
private PendingIntent mPendingIntent = null;
@Override
public void onCreate() {
Intent intent = new Intent(getApplicationContext(), MyService.class);
mPendingIntent = PendingIntent.getService(this, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
// 服务创建时时间
long now = System.currentTimeMillis();
// 定时器多久后启动
long later = 60000;
mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
// RTC 在指定的时刻,发送广播,但不唤醒设备
// RTC_WAKEUP 在指定的时刻,发送广播,并唤醒设备
mAlarmManager.setInexactRepeating(AlarmManager.RTC, now, later, mPendingIntent);
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(getApplicationContext(), "Callback Successed!", Toast.LENGTH_LONG).show();
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
咱们再实现一个功能,让这个服务在开机的时候启动,代码如下,注册一个广播事件,监听系统的Intent.ACTION_BOOT_COMPLETED
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//开机启动
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Intent startServiceIntent = new Intent(context, MyService.class);
startServiceIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(startServiceIntent);
}
}
}
接下来,在咱们的清单文件上加上这个服务和广播
<span style="white-space:pre"> </span><service
android:name="com.xiaoqiang.service.MyService"
android:enabled="true"
android:process=":remote" >
</service>
<receiver android:name="com.xiaoqiang.service.MyBroadcastReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
最后,在自己的程序中启动就OK啦,好了小强制作完成