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

AndroidService启动流程 Service自动重启原理  无论Service启动还是绑定成功后,都会调用ActiveServices的serviceDoneExecutingLocked方法,来看一下这个方法实现。 void serviceDoneExecutingLocked(ServiceRecord r, int type, int startId, int res) { boolean i... 阅读详情

本篇文章是对在Android中如何做到Service被关闭后又自动启动的方法进行了详细的分析和介绍。需要的朋友参考下


首先要说的是,用户可能把这种做法视为流氓软件。大部分时候,程序员也不想把软件做成流氓软件,没办法,领导说了算。

我们在使用某些Android应用的时候,可能会发现安装了某应用以后,会有一些服务也会随之运行。而且,这些服务每次都会随着手机开机而启动。有的服务做的更绝,当用户在运行的服务中手动停止该服务以后,过了一段时间,服务又自动运行了。虽然,从用户的角度来说,这种方式比较流氓。但是,从程序员的角度来说,这是如何做到的呢?经过研究,我发现有一种方式是可以实现的。下面就和大家分享。

先简单介绍,一会儿会贴上全部代码。

如何做到开机启动?

这个比较简单,网上的资料够多,只要实现一个BroadcastReceiver,监听手机启动完成的事件ACTION_BOOT_COMPLETED即可。需要注意的是,好像不能用模拟器,要用手机测试。

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

一般的,都会在上面说到的BroadcastReceiver的实现里面,监听手机启动完成后,启动一个Service,这是一般的做法。问题是,用户能够在服务里看到这个Service是常驻的。如果用户很敏感,就会停止该Service,甚至直接卸载掉相关的应用。那么,怎样才能定期实现某功能,又不让用户直接看到这个Service呢?聪明的你一定立即就想到了,如果不直接启动Service,而是启动一个timmer,或者alarmManager,然后每隔一段时间去启动Service,做完事情以后关闭掉Service就可以了。

还是看下面的全部代码吧,不过多解释了。这些代码中还是有不少概念的,不熟悉AlarmManager、PendingIntent、BroadcastReceiver、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该做的事  
    } 

下面是manifest文件的代码。

复制代码 代码如下:

<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> 

继续讨论这个问题。

如果用户停止整个应用(在管理应用程序中停止应用,或者第三方软件停止整个应用),此时整个进程被杀死,所有的服务自然也被杀死了,timmer,或者alarmManager也就停止了。此时就不会再定期启动服务了。

那么,怎么才能做到,用户或者第三方软件无法停止整个应用呢。我们可以再注册一个系统级别的监听(BroadcastReceiver),来监听系统级别的消息,再次启动timmer,或者alarmManager。这样,即使应用被杀死了,隔一段时间,应用还会自动启动。具体的,就不在这里展开了。


Android 开机自动启动一个Service 附源码 Android 开机自动启动一个Service 一、Google在更新Android8.0后对Service的权限越发收紧。导致目前想要启动服务必需实现服务的前台化,打开应用才能顺利启动service,否则在服务启动5秒后,系统将自动报错,会弹出一个提示窗口。实际测试得系统的app才能启动service。 二、android studio demo源码测试。 1、添加权限,接受开机完成广播,AndroidManifest.xml源码如下 ... 阅读详情

相关推荐

Android语言基础教程(228)Android Service应用之Service类中的重要方法Android后台管家Service:让你的应用在幕后偷偷干活的小能手

本文深入解析Android Service的核心方法与应用,揭秘这个后台"打工人"如何默默处理音乐播放、文件下载等任务。文章详细介绍了Service的两种启动方式、生命周期方法及使用技巧,并通过完整示例展示如何实际运用Service,帮助你打造更高效稳定的Android应用。

jxf_jxfcsdn的博客 943

android 服务自动运行怎么办,怎么解决安卓软件服务停止后又自启?

原标题:怎么解决安卓软件服务停止后又自启?昨天说到安卓软件是如何做到开机启动的?怎么解决?当然流氓的软件并不单单这种,还有更流氓的我明明清理过电视了,关闭程序了结果一会之后这个软件的服务又开起了,后台占着内存把机子弄得卡死了。下面我们就说说这种软件是如何做到服务停止后又自启的,以及怎么解决。描述:退出一个程序后,仍旧在运行的那部分叫做servive(进程),进程在系统内存不够时会被系统杀掉或者被清...

weixin_34505281的博客 1115

新时代多目标优化【数学建模】领域的极致探索——数学规划模型

数学规划模型是数学建模中用于描述和解决优化问题的一类模型。它通过构建目标函数和约束条件,将实际问题转化为数学形式,旨在寻找满足约束条件的最优解。数学规划模型广泛应用于各个领域,包括资源分配、生产计划、物流管理和金融投资等,通过线性规划、非线性规划、整数规划等方法,帮助决策者在复杂环境中做出最优选择。

小李很执着的博客 5841

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

首先要说的是,用户可能把这种做法视为流氓软件。大部分时候,程序员也不想把软件做成流氓软件,没办法,领导说了算。 我们在使用某些Android应用的时候,可能会发现安装了某应用以后,会有一些服务也会随之运行。而且,这些服务每次都会随着手机开机而启动。有的服务做的更绝,当用户在运行的服务中手动停止该服务以后,过了一段时间,服务又自动运行了。虽然,从用户的角度来说,这种方式比较流氓。但是,从程序员...

移动开发记录 470

Android实现开机自启动Service

首先做一个监听器: public class StartBroadcastReceiver extends BroadcastReceiver{ private static final String ACTION = "android.inten

穿拖鞋写程序 1383

Android中怎么启动关闭Service及功能解释

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人。

asdzxc324as的博客 1488

android如何关闭服务,Android中怎么启动关闭Service及功能解释

满意答案fty9804202016.09.06采纳率:51%等级:10已帮助:516人1、 Service不是分离开的进程,除非其他特殊情况,它不会运行在自己的进程,而是作为启动运行它的进程的一部分。2、 Service不是线程,这意味着它将在主线程里劳作。启动service有两种方法:1、 Context.startService()调用者与服务之间没有关联,即使调用者退出,服务仍...

weixin_39909212的博客 4316

Android中怎么启动关闭Service及功能解释 (1)

一线互联网Android面试题含详解(初级到高级专题)这些题目是今年群友去腾讯、百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率如果设置门槛,很多开发者朋友会因此错过这套高级架构资料,错过提升成为架构师的可能。这就失去了我们的初衷;让更多人都能通过高效高质量的学习,提升自己的技术和格局,升职加薪。最后送给大家一句话,望共勉,永远不要放弃自己的梦想和追求;

2401_84545884的博客 436

Service生命周期解析启动Service方法

生命周期解析好的,从上图的生命周期,我们可以知道,Android中使用Service的方式有两种: 1)StartService()启动Service 2)BindService()启动Service PS:还有一种,就是启动Service后,绑定Service! 1)相关方法详解: onCreate():当Service第一次被创建后立即回调该方法,该方法在整个生命周期 中只会调用依次! onDe

淮左明都的博客 2145

androidservice启动方法,Android Service学习篇二:Service启动方式之startService

由上面的生命周期图可以看出,它的生命周期只有三个阶段:onCreate、onStartCommand、onDestroy。需要注意的有:1. 如果是调用者直接退出而没有调用stopService的话,那么被启动Service会一直在后台运行,直至它的stopService方法被调用,或者它自己调用stopSelf方法。2. 在服务未被创建时,系统会先调用服务的onCreate方法,接着调用on...

weixin_39569753的博客 701

【安卓笔记】全面解析Service组件

serviceandroid四大组件之一,是一个长期运行在应用后台的android组件,它没有与用户交互的界面。 service的特点是: 1.长期运行在后台; 2.其他组件可以通过绑定操作与service进行交互; 3.默认运行在UI线程上; 4.无用户界面。 下面总结了service常见的知识点,帮助大家理解和复习serviceservice分类简介:

RowandJJ 3723

android 如何看服务,Android服务类Service具体解析

Service有什么作用?很多人不明确service是用来干嘛的。事实上Service作为Android四大组件之中的一个,能够理解为一个执行在后台的Activity。它适用于处理一些不干扰用户的长时间的后台操作,比方你播放器播放音乐之后跳到其他页面,音乐须要继续播放。那么这个时候就能够将音乐的播放一直执行在后台服务中,须要启动播放的时候就通过Activity去启动服务。再通过服务去调用播放,须要...

weixin_36048031的博客 733

Android基础—Service启动流程分析

Service的生命周期图生命周期解析好的,从上图的生命周期,我们可以知道,Android中使用Service的方式有两种: StartService()启动Service BindService()启动Service PS:还有一种,就是启动Service后,绑定Service! 相关方法详解: onCreate():当Service第一次被创建后立即回调该方法,该方法在整个生命周期 中只会调用

此博客已停用,博文会逐渐转移到新地址,http://blog.csdn.net/liupeifeng3514 510

Service的生命周期、两种启动方法的区别

Service的生命周期、两种启动方法的区别 一、A started service onCreate, onStartCommand, onBind 和 onDestroy。这几个方法都是回调方法,都是由Android操作系统在合适的时机调用的,并且需要注意的是这几个回调方法都是在主线程中被调用的。 1、onCreate: 执行startService方法时,如果Service没有运行的时候会...

自带橡皮的铅笔的博客 3954

Android Service演义

Android平台上,那种持续性工作一般都是由service来执行的。不少初学者总是搞不清service和线程、进程之间的关系,这当然会影响到他们开展具体的开发工作。 其实,简单说起来,service和线程、进程是没什么关系的。我们知道,在Android平台上已经大幅度地弱化了进程的概念,取而代之的是一个个有意义的逻辑实体,比如activity、service等。Service实体必然要寄身到某个进程里才行,它也可以再启动几个线程来帮它干活儿。但是,说到底service只是一个逻辑实体、一个运行期上下文

夜静水寒鱼不食 满船空载月明归 1495

Android - 服务 Service

既长期在后台运行,又能调用Service里面的方法。在Activity的onCreate()中startService()并bindService()顺序无所谓,在onDestroy()中unbindService(),根据情况在需要的地方stopService(),顺序无所谓两者都调用才会销毁服务。从Android 8.0开始,只有APP保持在前台可见状态的情况下 Service 才能保证稳定运行,一旦进入后台 Service 随时都有可能被系统回收,防止恶意APP长期在后台占用手机资源。

HugMua的博客 2517

Android service实例解析

Serviceandroid 系统中的一种组件,它跟Activity的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。Service启动有两种方式:context.startService() 和 context.bindService()。

Eqiqi的博客 1164

AndroidService生命周期方法Service启动方式bindService与StartService

Service是什么 服务(Service)是Android实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行 -————取自《第一行代码——AndroidService生命周期 自调用的方法

qq_28837549的博客 2137

基于深度确定性策略梯度的永磁同步电机强化学习控制方法

本文提出了一种基于深度确定性策略梯度(DDPG)的永磁同步电机(PMSM)电流内环智能控制方法。首先建立了PMSM在d-q坐标系下的数学模型,分析了传统矢量控制双闭环系统中PI控制器的局限性。针对电流内环控制问题,设计了包含电流跟踪误差、转速信息和历史控制量的状态空间,将电压输出作为动作空间,并构建了兼顾跟踪精度和响应速度的奖励函数。通过DDPG算法训练智能体,使其能够自适应调整控制策略。仿真结果表明,与固定参数的PI控制器相比,DDPG控制器在动态响应速度和抗干扰能力方面具有明显优势,为PMSM高性能控制

huanghm88的专栏 83

IMX287LLR-C.pdf

索尼IMX287 dataset,为图像传感技术提供文档,避免因手册不全面带来项目评估风险

上一篇: android避免service被杀
下一篇: Android Service 服务不被杀死的妙招
dong_cc
博客等级 码龄18年 14粉丝 45原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值