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

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

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

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 void onReceive(Context context, Intent mintent) {  if (Intent.ACTION_BOOT_COMPLETED.equals(mintent.getAction())) {  // 启动完成  Intent intent = new Intent(context, Alarmreceiver.class);  intent.setAction("arui.alarm.action");  PendingIntent sender = PendingIntent.getBroadcast(context, 0,  intent, 0);  long firstime = SystemClock.elapsedRealtime();  AlarmManager am = (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 void onReceive(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);  }  }
}  
package com.arui.framework.android.daemonservice;  import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;  public class DaemonService extends Service {  @Override  public IBinder onBind(Intent intent) {  return null;  }  @Override  public void onCreate() {  super.onCreate();  Log.v("=========", "***** DaemonService *****: onCreate");  }  @Override  public void onStart(Intent intent, int startId) {  Log.v("=========", "***** DaemonService *****: onStart");  // 这里可以做Service该做的事  }
}  
<receiver   android:name=" com.arui.framework.android.daemonservice.BootBroadcast"  android:permission="android.permission.RECEIVE_BOOT_COMPLETED">  <intent-filter>  <action android:name="android.intent.action.BOOT_COMPLETED" />  </intent-filter>
</receiver>
<receiver   android:name=" com.arui.framework.android.daemonservice.Alarmreceiver" >  <intent-filter>  <action android:name="arui.alarm.action" />  </intent-filter>
</receiver>  <service  android:name=" com.arui.framework.android.daemonservice.DaemonService" >  </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被关闭后又自动启动相关推荐

  1. [转]Android中程序与Service交互的方式——交互方式

    本文转自:http://blog.csdn.net/yihongyuelan/article/details/7216188 上一篇文章:Android中程序与Service交互的方式--综述 简述了 ...

  2. Android中程序与Service交互的方式

    本文将通过三大部分来讲解Android中程序与Service的交互方式,这里说的交互方式指的是如何与Service进行消息的传递,比如:从Service中获取信息,向Service发送信息等等.举个简 ...

  3. Android中让Service被关闭后再重新启动

    2019独角兽企业重金招聘Python工程师标准>>> --------------------------------------------------------------- ...

  4. Android 中的context, service,active和intent使用详解

    在一个Android应用中,主要是由四种组件组成的,这四种组件分别是Context,Activity,Intent,Service. Content被译为上下文,是应用程序中心,应用程序所有功能可以通 ...

  5. Android中Activity、Service和线程之间的通信

    Activity.Service和线程应该是Android编程中最常见的几种类了,几乎大多数应用程序都会涉及到这几个类的编程,自然而然的,也就会涉及到三者之间的相互通信,本文就试图简单地介绍一下这三者 ...

  6. android 屏蔽 广播,Android中使用BroadcastReceiver打开和关闭WIFI

    由于自动化测试需要,我们希望能够简单的控制Android手机的WIFI开和关,而不是通过UI操作的方式.由于每个Android机型的UI都千差万别,所以需要找到一个通用得方式来满足我们的需求. 最开始 ...

  7. android中AndroidManifest.xml 的解析 (转)

    虽然,也做了android开发一年多,可一直有的东西一直了解的不透彻,有时间会把好的东西,分享出来,大家一起学习进步,今天就从mainfest开始. 转自(http://my.eoe.cn/10876 ...

  8. 从源码角度分析Android中的Binder机制的前因后果

    为什么在Android中使用binder通信机制? 众所周知linux中的进程通信有很多种方式,比如说管道.消息队列.socket机制等.socket我们再熟悉不过了,然而其作为一款通用的接口,通信开 ...

  9. Android中的onActivityResult和setResult方法的使用

    $*********************************************************************************************$ 博主推荐 ...

最新文章

  1. ORA-08002: sequence MySeq.currval is not yet defined in this session
  2. 自定义YUM软件仓库----FTP网络YUM源-----网络YUM源的配置
  3. boost::callable_traits的qualified_class_of_t的测试程序
  4. 转载--微分几何为何必然兴起?
  5. CAN笔记(14) STM32-M4 寄存器
  6. 黑客在数十个 WordPress 插件和主题中插入秘密后门,可发动供应链攻击
  7. 《Spring Cloud Netflix》 -- 服务注册和服务发现-Eureka的常用配置
  8. SharePoint 设置Library中文档的默认打开方式
  9. 隐藏水滴屏的软件_手机隐藏水滴屏的APP
  10. 花生壳ping域名得到的IP与实际IP不一致的解决方法
  11. 舍得酒业前三季营收净利双增背后 低档酒提速拖累Q3毛利率
  12. CSS画五星红旗,我请AutoCAD帮忙
  13. Linux/Ubuntu18.04安装RTL8811cu驱动
  14. 学好mysql教材_MySQL基础学习
  15. 深入了解分布式事务组件 Seata :AT 模式(二)
  16. 上下五千年历史朝代歌
  17. 向量或矩阵的微分计算
  18. MySQL索引,检索数据库
  19. mysql服务重启和关闭
  20. (转霄神)HM解码流程图

热门文章

  1. 周鸿祎为何忘不掉搜索?
  2. LSJ_NHibernate第一章 NHibernate介绍
  3. php7 编译安装,添加扩展 pdo /usr/local/php/bin/phpize 发现没有 configure
  4. Ubuntu redmine 安装
  5. 赞一个 kindle电子书有最新的计算机图书可买了【Docker技术入门与实战】
  6. python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(二)
  7. 用Python处理Excel文件
  8. 【转】JavaScript中的this关键字使用的四种调用模式
  9. GI OPatch升级 The opatch Component check failed. This patch is not applicable for...
  10. 使用Vitamio打造自己的Android万能播放器(4)——本地播放(快捷搜索、数据存储)...