Android Service 自动启动
2014-02-21 16:50
281 查看
我们在使用某些Android应用的时候,可能会发现安装了某应用以后,会有一些服务也会随之运行。而且,这些服务每次都会随着手机开机而启动。有的服务做的更绝,当用户停止该服务器以后,过了一段时间,服务又自动运行了。虽然,从用户的角度来说,这种方式比较流氓。但是,从程序员的角度来说,这是如何做到的呢?经过研究,我发现有一种方式是可以实现的。下面就和大家分享。
先简单介绍,一会儿会贴上全部代码。
如何做到开机启动?
这个比较简单,网上的资料够多,只要实现一个BroadcastReceiver,监听手机启动完成的事件ACTION_BOOT_COMPLETED即可。需要注意的是,好像不能用模拟器,要用手机测试。
那如何做到启动一个Service,并且在用户关闭后能自动又启动了呢?
一般的,都会在上面说到的BroadcastReceiver的实现里面,监听手机启动完成后,启动一个Service,这是一般的做法。问题是,用户可以关闭掉该Service。那么怎样才能使它被关闭掉以后,再次启动呢?聪明的你一定立即就想到了,如果不直接启动Service,而是启动一个 timmer,或者alarmManager,然后每隔一段时间去启动Service,就可以了。
还是看下面的全部代码吧,不过多解释了。这些代码中还是有不少概念的,不熟悉AlarmManager、PendingIntent、BroadcastReceiver、Service等等这些概念的同学可以百度一下。
下面是manifest文件的代码
标签:
Android SDK
补充话题说明»
分享到
收藏
18
举报
踩 0 | 顶 1
rigortek 回答于 2012-09-11 15:49
举报
系统起来后就周期性的发送广播,有必要么?这得不停消耗资源。
再者service反复被调用
有帮助(0) | 没帮助(0) | 评论(0) | 引用此评论
当空皓月 回答于 2013-12-09 20:28
举报
真机测试,重启手机,收不到广播啊,怎么回事?
没有打印任何东西啊
public class BootBroadcastextends 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>
先简单介绍,一会儿会贴上全部代码。
如何做到开机启动?
这个比较简单,网上的资料够多,只要实现一个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 |
22 | AlarmManager am = (AlarmManager) context |
23 | .getSystemService(Context.ALARM_SERVICE); |
24 |
25 | // 10秒一个周期,不停的发送广播 |
26 | am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, |
27 | 10 * 1000 , |
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 |
43 |
44 | if (intent.getAction().equals( "arui.alarm.action" )) { |
45 | Intent i = new Intent(); |
46 | i.setClass(context, DaemonService. class ); |
47 | // |
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( "=========" , "***** ); |
19 | } |
20 |
21 | @Override |
22 | public void onStart(Intent int startId) { |
23 | Log.v( "=========" , "***** ); |
24 | // 这里可以做Service该做的事 |
25 | } |
26 | } |
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 回答于 2012-09-11 15:49
举报
系统起来后就周期性的发送广播,有必要么?这得不停消耗资源。
再者service反复被调用
onStart有无问题? 能不能在改进为这样?系统起来后
启动
Alarmreceiver,service
再kill
Alarmreceiver,
service在被kill时,启动
Alarmreceiver,如此循环。
有帮助(0) | 没帮助(0) | 评论(0) | 引用此评论
当空皓月 回答于 2013-12-09 20:28
举报
真机测试,重启手机,收不到广播啊,怎么回事?
没有打印任何东西啊
public class BootBroadcastextends 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>
相关文章推荐
- 也谈Android中的Context(1)
- android 电子书源码,翻页效果
- Android 开发性能优化之SparseArray(三)
- android项目用到的公共类方法
- 近百android开源项目贡献
- Android 使用ViewPager实现左右循环滑动图片
- Android开源项目汇总
- [学习笔记]android:系列样式大全
- Android 开发性能优化之SparseArray(二)
- Android 将若干张图片拼接在一起形成一个全新的图片
- android手把手教你开发launcher(五)——设置壁纸
- android手把手教你开发launcher(四)——显示widget
- android手把手教你开发launcher(三)——启动安装的应用程序
- android手把手教你开发launcher(二)——列出安装的应用程序
- android开发 打开各种系统设置信息页面 android.settings
- android手把手教你开发launcher(一)(AndroidStudio版)
- 开发Flash ANE(Android版)
- Android 开发性能优化之SparseArray(一)
- Android:Serializable的作用
- android 增量更新之客户端