1、主要内容

本章记录几段常用代码:
1、如何使用AlarmManager守护服务
2、如何判断某服务是否正在运行
2、如何暂时禁用Android的组件

2、使用AlarmManager守护服务

BootReceiver.java
@Override
public void onReceive(Context context, Intent intent) {
//接收开机启动广播,启动服务,开启alarm定时任务
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
//xxx.class我们要守护的服务
Intent serviceIntent = new Intent(context, xxxx.class);
context.startService(serviceIntent);
startAlarmEvent(context);
}
//监听自定义广播,开启alarm定时任务
if (intent.getAction().equals("xxxxx")) {
startAlarmEvent(context);
} //监听自定义广播,关闭alarm定时任务
if (intent.getAction().equals("cn.zcgames.ghostclaw.action.STOP_SERVICE")) {
Log.d(Tag, "Receive Stop Service Completed broadcast, start Alarm");
stopAlarmEvent(context);
}
} //开启定时任务,手动开启的时候调用
private void startAlarmEvent(Context context) {
Intent alarmIntent = new Intent(context, AlarmReceiver.class);
//listen_receiver为AlarmReceiver.java注册的感兴趣的广播
alarmIntent.setAction("listen_receiver");
PendingIntent sender = PendingIntent.getBroadcast(context, 0,
alarmIntent, 0);
long firstime = SystemClock.elapsedRealtime();
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
//每6秒钟发送一次广播,API 23后,最短时间间隔为6秒
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstime, 10 * 6000, sender);
}
//关闭定时任务,手动关闭的时候调用,防止自己也停止不了
private void stopAlarmEvent(Context context) {
Intent alarmIntent = new Intent(context, AlarmReceiver.class);
//listen_receiver为AlarmReceiver.java注册的感兴趣的广播
alarmIntent.setAction("listen_receiver");
PendingIntent sender = PendingIntent.getBroadcast(context, 0,
alarmIntent, 0);
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
//取消发送广播
alarmManager.cancel(sender);
}

AlarmReceiver.java

@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("listen_receiver")) {
//如果监听的服务挂掉了,则启动服务
if (serviceIsRunnting(context, "xxxService")) {
Intent serviceIntent = new Intent(context, xxxService.class);
context.startService(serviceIntent);
}
}
}

2、如何判断某服务是否正在运行

//判断服务是否在运行
boolean serviceIsRunnting(Context context, String servcieName) {
boolean isRunning = false;
ActivityManager activityManager=null;
List<ActivityManager.RunningServiceInfo> serviceList=null; try{
activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
}catch (Exception e){
e.printStackTrace();
}
if(activityManager != null){
serviceList = activityManager.getRunningServices(Integer.MAX_VALUE);
} if (!(serviceList.size()>0)) {
return false;
} for (int i=0; i<serviceList.size(); i++) {
if (serviceList.get(i).service.getClassName().equals(servcieName)) {
isRunning = true;
break;
}
}
return isRunning;
}

3、如何暂时禁用Android的组件

private void setComponentState(boolean enable){
//xxx为app的某组件,我这里是receiver
final ComponentName alarmReceiver = new ComponentName(getApplication(), xxxx.class);
final PackageManager packageManager = getApplication().getPackageManager(); if(enable){
packageManager.setComponentEnabledSetting(alarmReceiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}else{
packageManager.setComponentEnabledSetting(alarmReceiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
}

根据我的使用经验,当在应用中禁用某组件后,系统会记录此状态,直接在as上点运行,替换原来的应用或者重启手机,系统仍然是禁用的(卸载后再安装系统会删除状态记录).

所以各位使用的时候需要注意到这一点,禁用后记得打开。

PS: 如果禁止的是主MainActivity,则桌面图标会消失

AlarmManager守护服务和隐藏桌面图标的更多相关文章

  1. C#隐藏桌面图标和任务栏

    最近因为项目需要需要实现桌面图标和任务状态栏的隐藏功能,实现的方式很多,比如修改注册表值,调用windows API函数等.经过一番的查阅,这个功能暂时实现了,或许不是很好的方法,但是我预期的效果达到 ...

  2. 修改apk显示或隐藏桌面图标

    反编译CM设置,打开AndroidManifest.xml,搜索“DEFAULT”,把他替换为"LAUNCHER",然后回编译,回编译之后签名在用RE放到system\app下该权 ...

  3. C# 隐藏显示桌面图标

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. 解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离

        在某国外大型汽车公司BI项目中,有一个子项目,需要通过大屏幕展示销售报表,程序需要自动启动和关闭.开发人员在开发过程中,发现在Win7的service中不能直接操作UI进程,调查过程中,发现如 ...

  5. Windows Server 2008 显示桌面图标

    相信有朋友们有安装使用过windows 2008 server服务器,刚安装好的时候,桌面上只有一个回收站的图标,它没有像windows 7或windows 8一样可以直接通过右击鼠标的菜单来设置,要 ...

  6. win7家庭版更改桌面图标

    电脑 Win7家庭普通版 方法/步骤   1 选择左下角开始. 2 在搜索栏中,输入“ico”,选择“显示或隐藏桌面上的通用图标”. 3 出现桌面图标设置,选择“更改图标”.

  7. Extjs2.0 desktop 动态创建桌面图标和开始菜单

    这几天一直纠结Extjs desktop怎么动态读取数据,用Ext.net已经实现但是不灵活.Ext.net做出来的桌面在窗口关闭后只是隐藏该窗口,并没有释放,对于我这种js菜鸟来说,改那一坨代码要人 ...

  8. 解决由腾讯qq浏览器引起win10系统桌面图标不停的闪烁问题

    win10系统桌面图标不停的闪烁,虽然不会引起太大问题,但是看着实在郁闷在网上搜索了很久,像停止问题报告服务,重置为默认应用都无解,了解到大概是软件兼容性问题于是打开服务管理器,一个一个关闭不是微软的 ...

  9. Windows XP解决显示桌面图标消失的问题

    1.依次单击“开始”,“运行”,在运行对话框中输入regsvr32 /n /i:u shell32.dll,按回车键 2.弹出“shell32.dll中的DllInstall成功”的窗口,表明已将数据 ...

随机推荐

  1. EFCore中SQLSERVER 2008 的分页问题

    自SQLSERVER 2012起新增了 Offset Fetch 语法,因此EFCore默认是以此语法生成相应的分页语句的. 如果我们的目标数据库低于 2012,那么EFCore默认生成的语句在执行的 ...

  2. ndk的注意事项

    从开源网站下载的源码,需要自己编译c源码成so类库.当时用Android studio 运行总是报错"finished with non-zero exit value 2"报错定 ...

  3. S5700的Eth-Trunk端口汇聚(trunk实验)

    S5700的Eth-Trunk端口汇聚 链路汇聚和端口汇聚,就是端口聚合,交换机的堆叠是堆叠和端口聚合无关. 端口聚合概念:(包括二层端口聚合和三层端口聚合) 1.端口聚合IEEE标准是将最多16条链 ...

  4. UNIX高级环境编程(12)进程关联(Process Relationships)- 终端登录过程 ,进程组,Session

    在前面的章节我们了解到,进程之间是有关联的: 每个进程都有一个父进程: 子进程退出时,父进程可以感知并且获取子进程的退出状态. 本章我们将了解: 进程组的更多细节: sessions的内容: logi ...

  5. 新人如何进入IT行业

    你遇到了我刚毕业时遇到的问题. 现在需要知道你希望在那里就业,上海和北京就业的待遇差不多,北京能比上海稍微少点(我是指你这类刚毕业的) 说主题好了 应届毕业,找工作都很难的,因为现在很多企业是不愿意找 ...

  6. 【转】开篇python--明白python文件如何组织,理解建立源文件

    在Python 中引用是非常简单的事情,这里需要清楚三个概念就可以了包.模块.类.类这个就不用说了. 模块对应的是一个.py 文件,那么module_name 就是这个文件去掉.py 之后的文件名,p ...

  7. .Net使用163smtp发送邮件时错误:邮箱不可用. has no permission解决方法

    C#实现简单邮件发送代码如下 public static void SendAsync(string emailTo, string subject, string mailBody) { var m ...

  8. 最好用的jquery列表拖动排列(由项目提取)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wuchengzeng/article/details/31766235 最好的jquery列表拖动排 ...

  9. [题目] Luogu P3716 [CTSC2000]冰原探险

    题面 题目背景 传说中,南极有一片广阔的冰原,在冰原下藏有史前文明的遗址.整个冰原被横竖划分成了很多个大小相等的方格.在这个冰原上有N个大小不等的矩形冰山,这些巨大的冰山有着和南极一样古老的历史,每个 ...

  10. 可以获取JVM信息的一些管理工具类

    一些可以获取JVM信息的java工具类 BufferPoolMXBean.class ClassLoadingMXBean.class CompilationMXBean.class GarbageC ...