android打不死的小强——永不磨灭的Servicr

来源:互联网 发布:Linux tail查找 编辑:程序博客网 时间:2024/04/29 22:51

笔者在这里就不多说了,因为一般人们都不喜欢这样的东西,尤其是有洁癖的人更是如此,总是喜欢时不时的杀进程杀服务,可是由于android开源的特殊性,你会发现被干掉的服务又一次的重新复活了,总之生命力极其强悍,业界称之为——打不死的小强。

对于用户也许这个小强很是讨厌,可是对于开发者来说,由于需求,不得不做一个小强(是不是说俺们程序猿也是很讨厌啊。。呜呜。。)

废话不多说,小强的做法有很多种,像主流的微信、QQ等都是启动两个服务,两个服务之间相互监听,一个被干掉,另外一个会立即启动被干掉的这个,由于服务在Android的“地位”最高,所以服务中的监听会优先执行。这就是QQ、微信的做法。

在这里我用的是自己的做法,做法与他们原理相同,不过我是设置了一个定时器,如果服务被干掉,服务会在指定的时间后重启。这个时间你来定,是不是很爽啊,要是定的时间很小,哈哈,恭喜你,你制作了一个病毒大笑,由于服务会一直启动,会使你的机子卡死。。。。。。

首先,自己做一个Service

public class MyService extends Service {/** * 定时器 */private AlarmManager mAlarmManager = null;private PendingIntent mPendingIntent = null;@Overridepublic 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();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Toast.makeText(getApplicationContext(), "Callback Successed!", Toast.LENGTH_LONG).show();return START_STICKY;}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onDestroy() {super.onDestroy();}}

咱们再实现一个功能,让这个服务在开机的时候启动,代码如下,注册一个广播事件,监听系统的Intent.ACTION_BOOT_COMPLETED

public class MyBroadcastReceiver extends BroadcastReceiver {@Overridepublic 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啦,好了小强制作完成

代码0分下载

0 0
原创粉丝点击