Android Service被关闭后重启

         关于Service重启,我们在面试的时候有可能会问到,虽然,从用户的角度来说,这种方式比较流氓。但是,从程序员的角度来说,这是如何做到的呢?经过研究,我发现有一种方式是可以实现的。下面就和大家分享。

先简单介绍,一会儿会贴上全部代码。

    如何做到开机启动?

这个比较简单,网上的资料够多,只要实现一个BroadcastReceiver,监听手机启动完成的事件ACTION_BOOT_COMPLETED即可。需要注意的是,好像不能用模拟器,要用手机测试。

那如何做到启动一个Service,并且在用户关闭后能自动又启动了呢?

         一般的,都会在上面说到的BroadcastReceiver的实现里面,监听手机启动完成后,启动一个Service,这是一般的做法。问题是,用户能够在服务里看到这个Service是常驻的。如果用户很敏感,就会停止该Service,甚至直接卸载掉相关的应用。那么,怎样才能定期实现某功能,又不让用户直接看到这个Service呢?聪明的你一定立即就想到了,如果不直接启动Service,而是启动一个timmer,或者alarmManager,然后每隔一段时间去启动Service,做完事情以后关闭掉Service就可以了。

还是看下面的全部代码吧,不过多解释了。这些代码中还是有不少概念的,不熟悉AlarmManagerPendingIntentBroadcastReceiverService等等这些概念的同学可以百度一下。

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 voidonReceive(Context   context, Intent mintent) { 

           if (Intent.ACTION_BOOT_COMPLETED.equals(mintent.getAction())){ 

               // 启动完成 

               Intentintent = new Intent(context,Alarmreceiver.class); 

               intent.setAction("arui.alarm.action"); 

               PendingIntentsender = PendingIntent.getBroadcast(context,0, 

                       intent, 0); 

               long firstime= SystemClock.elapsedRealtime(); 

               AlarmManageram = (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 voidonReceive(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); 

           } 

       } 

   }   

    import  android.app.Service; 

    import android.content.Intent; 

    import android.os.IBinder; 

    import android.util.Log; 

     

    public class DaemonService   extends Service{ 

        @Override 

        public IBinderonBind(Intent intent) { 

           return null

       } 

        @Override 

        public voidonCreate(){ 

           super.onCreate(); 

           Log.v("=========","*****DaemonService *****: onCreate"); 

       } 

     

        @Override 

        public voidonStart(Intent  intent, int startId) { 

           Log.v("=========","*****DaemonService *****: onStart"); 

           // 这里可以做Service该做的事 

       } 

   }  

 

下面是manifest文件的代码。

<receiver

        android:name="com.arui.framework.android.daemonservice.BootBroadcast"

        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

        <intent-filter>

           <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>

        </intent-filter>

    </receiver>

    <receiverandroid:name="com.arui.framework.android.daemonservice.Alarmreceiver">

        <intent-filter>

           <actionandroid:name="arui.alarm.action"/>

        </intent-filter>

    </receiver>

    <serviceandroid:name="com.arui.framework.android.daemonservice.DaemonService">

    </service>

 继续讨论这个问题。

如果用户停止整个应用(在管理应用程序中停止应用,或者第三方软件停止整个应用),此时整个进程被杀死,所有的服务自然也被杀死了,timmer,或者alarmManager也就停止了。此时就不会再定期启动服务了。

那么,怎么才能做到,用户或者第三方软件无法停止整个应用呢。我们可以再注册一个系统级别的监听(BroadcastReceiver),来监听系统级别的消息,再次启动timmer,或者alarmManager。这样,即使应用被杀死了,隔一段时间,应用还会自动启动。具体的,就不在这里展开了。

 

希望对大家有所帮助 谢谢!

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值