Android Service 自动启动

我们在使用某些Android应用的时候,可能会发现安装了某应用以后,会有一些服务也会随之运行。而且,这些服务每次都会随着手机开机而启动。有的服务做的更绝,当用户停止该服务器以后,过了一段时间,服务又自动运行了。虽然,从用户的角度来说,这种方式比较流氓。但是,从程序员的角度来说,这是如何做到的呢?经过研究,我发现有一种方式是可以实现的。下面就和大家分享。

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

如何做到开机启动?

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

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

一般的,都会在上面说到的BroadcastReceiver的实现里面,监听手机启动完成后,启动一个Service,这是一般的做法。问题是,用户可以关闭掉该Service。那么怎样才能使它被关闭掉以后,再次启动呢?聪明的你一定立即就想到了,如果不直接启动Service,而是启动一个 timmer,或者alarmManager,然后每隔一段时间去启动Service,就可以了。

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

01 package com.arui.framework.android.daemonservice; 
02    
03 import android.app.AlarmManager; 
04 import android.app.PendingIntent; 
05 import android.content.BroadcastReceiver; 
06 import android.content.Context; 
07 import android.content.Intent; 
08 import android.os.SystemClock; 
09    
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
32  
33  
34 package com.arui.framework.android.daemonservice; 
35    
36 import android.content.BroadcastReceiver; 
37 import android.content.Context; 
38 import android.content.Intent; 
39    
40 public class Alarmreceiver extends BroadcastReceiver { 
41     @Override 
42     public void onReceive(Context context, Intent intent) { 
43    
44         if (intent.getAction().equals("arui.alarm.action")) { 
45             Intent i = new Intent(); 
46             i.setClass(context, DaemonService.class); 
47             // 启动service  
48             // 多次调用startService并不会启动多个service 而是会多次调用onStart 
49             context.startService(i); 
50         
51     
52 }

01 package com.arui.framework.android.daemonservice; 
02        
03     import android.app.Service; 
04     import android.content.Intent; 
05     import android.os.IBinder; 
06     import android.util.Log; 
07        
08     public class DaemonService extends Service { 
09        
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文件的代码

01 <receiver  
02     android:name=" com.arui.framework.android.daemonservice.BootBroadcast" 
03     android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
04     <intent-filter
05         <action android:name="android.intent.action.BOOT_COMPLETED" /> 
06     </intent-filter
07 </receiver
08 <receiver  
09     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>
标签: Android SDK
    分享到 
    18
      0 |    1

    按默认排序 | 显示最新评论 | 回页面顶部共有2个评论 发表评论»

    • rigortek
      rigortek 回答于 2012-09-11 15:49
      系统起来后就周期性的发送广播,有必要么?这得不停消耗资源。 

      再者service反复被调用onStart有无问题?

      能不能在改进为这样?
      系统起来后启动Alarmreceiver,service再kill Alarmreceiver,service在被kill时,启动Alarmreceiver,如此循环。

      有帮助 (0) |  没帮助 (0) |  评论 (0) |  引用此评论
    • 当空皓月
      当空皓月 回答于 2013-12-09 20:28

      真机测试,重启手机,收不到广播啊,怎么回事?

      没有打印任何东西啊

      public class BootBroadcast extends BroadcastReceiver
      {
       @Override
       public void onReceive(Context context, Intent intent)
       {
        System.out.println("BootBroadcast 收到!");
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
        {
         System.out.println("BootBroadcast 进入条件语句!");
         Intent intent2=new Intent(context, AlarmReceiver.class);
         intent.setAction("my.alarm.action");
            PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent2, 0);
            long firsttime = SystemClock.elapsedRealtime();
            System.out.println("firsttime:"+firsttime);
         AlarmManager mAlarmManager=(AlarmManager)context.getSystemService(context.ALARM_SERVICE);
         //10s一个周期,不停的发送广播
         mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firsttime, 10*1000, sender);
        }    
       }

       

       <receiver android:name="com.interview.broadcast.BootBroadcast"
                  android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
                  <intent-filter >
                      <action android:name="android.intent.action.BOOT_COMPLETED"/>
                  </intent-filter>
              </receiver>

    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值