您的位置:首页 > 移动开发 > Android开发

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等等这些概念的同学可以百度一下。

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 回答于 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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: