`
bolutes
  • 浏览: 868643 次
文章分类
社区版块
存档分类
最新评论

Android中如何做到Service被关闭后又自动启动

 
阅读更多

转载:GL(arui319)http://blog.csdn.net/arui319 http://blog.csdn.net/arui319/article/details/7040980

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

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


备注一:这里面涉及的PendingIntent之前没有接触过
转载:http://www.devdiv.com/home.php?mod=space&uid=1&do=blog&id=2644

Intent比较简单,类似消息,发送给别的activity,别的activity会立即执行
我主要说说什么是PendingIntent以及它的执行过程
以alarm service为例:
1. activity请求一个alarm一般这样来做:
# //创建一个PendingIntent
# Intent intent = new Intent(ALARM_ALERT_ACTION);
# intent.putExtra(ID, id);
# intent.putExtra(TIME, atTimeInMillis);
# PendingIntent sender = PendingIntent.getBroadcast(
# context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
# //获得AlarmMnager并注册一个新闹铃,
# //一次性闹铃的设置
#
# AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
# am.set(AlarmManager.POWER_OFF_WAKEUP, atTimeInMillis, sender);
2. AlarmManager.set调用AlarmManagerService.set
3. AlarmManagerService.set的核心代码如下:

我们可以看到它就是把PendingIntent保存起来而已
4. alarm manager service会定时查看是否有alarm到期了,如果到期了做相应处理。
5. AlarmThread会调用
alarm.operation.send(mContext, 0,
mBackgroundIntent.putExtra(
Intent.EXTRA_ALARM_COUNT, alarm.count),
mResultReceiver, mHandler);
也就是通过PendingIntent.send执行intent操作,alarm这个就会发送ALARM_ALERT_ACTION的broadcast。

补充说明:
1. PendingIntent重要特点是异步处理。
2. 另外有一个要说明的是PendingIntent.onFinished,它可以作为PendingIntent.send的一个参数,
我们知道PendingIntent.send一般是在service中执行,这个调用的send后,回调onFished类的onSendFinished,所以onSendFinished一般也是在service中执行的


首先看官方解释:An Intent is something that is used right now; a PendingIntent is something that may create an Intent in the future. You will use a PendingIntent with Notifications, AlarmManager, etc.

PendingIntent就是一个Intent的描述,我们可以把这个描述交给别的程序,别的程序根据这个描述在后面的别的时间做你安排做的事情(By giving a PendingIntent to another application, you are granting it the right to perform the operation you have specified as if the other application was yourself,就相当于PendingIntent代表了Intent)


备注二:AlarmManager

转载:http://www.cnblogs.com/jico/archive/2010/11/03/1868361.html

AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作

AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.

下面的代码详细的介绍了两种定时方式的使用:

(1)在指定时长后执行某项操作

代码 

       //操作:发送一个广播,广播接收后Toast提示定时操作完成
Intent intent =new Intent(Main.this, alarmreceiver.class);
intent.setAction(
"short");
PendingIntent sender
=
PendingIntent.getBroadcast(Main.
this, 0, intent, 0);

//设定一个五秒后的时间
Calendar calendar=Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND,
5);

AlarmManager alarm
=(AlarmManager)getSystemService(ALARM_SERVICE);
alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
//或者以下面方式简化
//alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5*1000, sender);

Toast.makeText(Main.
this, "五秒后alarm开启", Toast.LENGTH_LONG).show();

//注意:receiver记得在manifest.xml注册

代码
public static class alarmreceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals("short")){
Toast.makeText(context,
"short alarm", Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(context,
"repeating alarm",
Toast.LENGTH_LONG).show();
}
}
}

(2)周期性的执行某项操作

代码
Intent intent =new Intent(Main.this, alarmreceiver.class);
intent.setAction(
"repeating");
PendingIntent sender
=PendingIntent
.getBroadcast(Main.
this, 0, intent, 0);
//开始时间
long firstime=SystemClock.elapsedRealtime();

AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
  //5秒一个周期,不停的发送广播
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP
, firstime,
5*1000, sender);

AlarmManager的setRepeating()相当于Timer的Schedule(task,delay,peroid);有点差异的地方时Timer这个方法是指定延迟多长时间

以后开始周期性的执行task;

AlarmManager的取消:(其中需要注意的是取消的Intent必须与启动Intent保持绝对一致才能支持取消AlarmManager)

代码
Intent intent =new Intent(Main.this, alarmreceiver.class);
intent.setAction(
"repeating");
PendingIntent sender
=PendingIntent
.getBroadcast(Main.
this, 0, intent, 0);
AlarmManager alarm
=(AlarmManager)getSystemService(ALARM_SERVICE);
alarm.cancel(sender);








分享到:
评论

相关推荐

    解析Android中如何做到Service被关闭后又自动启动的实现方法

    有的服务做的更绝,当用户在运行的服务中手动停止该服务以后,过了一段时间,服务又自动运行了。虽然,从用户的角度来说,这种方式比较流氓。但是,从程序员的角度来说,这是如何做到的呢?经过研究,我发现有一种...

    安卓后台保活服务service,自动重启APP

    安卓后台保活服务service,自动重启APP

    Android代码-android-UCToast

    本项目模拟实现该功能,即:开机自动启动的 Service 监听剪切板。复制之后,在屏幕顶部显示一个悬浮窗,显示剪贴板内容。点击悬浮窗,跳转到 Activity 页面显示。 兼容到 API level 9。 包含以下几个小功能点: ...

    新版Android开发教程.rar

    ANDROID 的推出后可能影响的产业包括移动电信业,软件开发业,手机制造业,在以消费者为核心的状 态 。 对消费者的影响 � 高档手机选择面增加。 � A ndroid 在设计初期就考虑了与现其有业务的融合,改变以往从...

    实验四-Android基本组件交互实验.doc

    startActivityForResult ——跳转到下一个Activity,而当这个Activity被关闭以后,自动跳转前一个Activity ,并调用onActivityResult( )方法,参数为Intent和requestcode 2. Intent Android基本的设计理念是鼓励...

    疯狂Android讲义源码

     4.1.3 启动、关闭Activity 179  4.1.4 使用Bundle在Activity之间  交换数据 181  4.1.5 启动其他Activity并返回结果 185  4.2 Activity的回调机制 189  4.3 Activity的生命周期 190  4.3.1 Activity的生命...

    Android powermanger wakelock

    注:在PowerManagerService 类中没有实现nativeAcquireWakeLock,其实现体在 frameworks/base/core/jni/android_os_Power.cpp中,所以nativeAcquireWakeLock()方法时会调用JNI下的实现方法。 3).JNI层的实现 ...

    Google Android SDK开发范例大全(第3版) 1/5

    全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...

    Google Android SDK开发范例大全(第3版) 4/5

    全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...

    Google Android SDK开发范例大全(第3版) 3/5

    全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...

    Google Android SDK开发范例大全(第3版) 5/5

    全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...

    疯狂Android讲义.part2

    4.1.3 启动、关闭Activity 179 4.1.4 使用Bundle在Activity之间 交换数据 181 4.1.5 启动其他Activity并返回结果 185 4.2 Activity的回调机制 189 4.3 Activity的生命周期 190 4.3.1 Activity的生命周期演示 190 ...

    疯狂Android讲义.part1

    4.1.3 启动、关闭Activity 179 4.1.4 使用Bundle在Activity之间 交换数据 181 4.1.5 启动其他Activity并返回结果 185 4.2 Activity的回调机制 189 4.3 Activity的生命周期 190 4.3.1 Activity的生命周期演示 190 ...

    Android开发之AlarmManager的用法详解

    Android中的AlarmManager实质上是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activity,Service,BroadcastReceiver)。 一、概述: 该类提供一种访问系统闹钟...

    Android开发资料合集-World版!

    9.86、ANDROID自动化测试初探 324 9.86.1、捕获Activity上的Element 324 9.86.2、Hierarchyviewer 捕获Element的 328 9.86.3、架构实现 330 9.86.4、模拟键盘鼠标事件(Socket+Instrumentation实现) 332 9.86.5、再...

Global site tag (gtag.js) - Google Analytics