前台服务

根据网上的只是,Service包活的方法有很多,什么双进程守护,双服务守护,ondestory中重启进程。但是呢,个人感觉还是前台进程靠谱。

用法

前台进程跟普通的方法很相似,只是在onstartcomment方法里调用创建通知的方法:

 public int onStartCommand(Intent intent, int flags, int startId) {


        Notification.Builder builder = new Notification.Builder(this.getApplicationContext());
        Intent nfIntent = new Intent(this, MainActivity.class);
       builder.setDeleteIntent(PendingIntent.getBroadcast(getApplicationContext(), DELETE_CODE, new Intent("com.zhongwei.service"), 0));
        builder.setContentIntent(PendingIntent.getActivity(this, 0, nfIntent, 0)).setContentTitle("云").setContentText("环的小管家").setSmallIcon(R.drawable.appicon).setWhen(System.currentTimeMillis());
      Notification notification=builder.build();
        notification.defaults=Notification.DEFAULT_SOUND;
        startForeground(110,notification);
        return super.onStartCommand(intent, flags, startId);
    }

通知栏的通知被销毁

我测试的时候用的是华为c8818,跟普通service相比,当同时长击小方块打开任务管理器,把应用销毁。这时候普通service停止,而前台servie继续进行。但是如果先把前台服务的通知销毁,然后在任务管理器里销毁应用,前台服务也随之销毁。也就是说,当通知没有的时候,前台服务跟普通服务变成一样的。
这时候我决定自定义一个广播,监听通知栏的销毁。如果前台服务通知被销毁,则重新开启一个前台服务

看一下生命周期

第一次启动前台服务: oncreate — onstartcomment
启动任务管理器,关闭程序 生命周期没有变化
程序不销毁,关闭通知 onstartcomment()
把程序销毁,关闭通知 oncreate—- onstartcomment()

不过奇怪的是,我虽然监听了通知栏的销毁,当销毁 的时候重新打开一个前台服务,这个前台服务在销毁的时候没有调用ondestory

锁屏前台服务被销毁

经过测试,当锁屏的时候前台服务也是会被销毁的。但是销毁的条件是这个软件已经退出,如果软件依然是可见的,则服务也是不能被销毁的。
我启用的方法是,当用户点击返回按钮,不把activity退出,退到后台。运用广播接收器监听用户的锁屏事件,当屏幕锁屏,启动另外一个activiy,只不过这个activity是一个像素,透明的。当解锁的时候,关闭该activity。
另外,这时候系统的广播是不能在配置文件中注册的,必须在代码中设置。

前台服务取消通知栏

再启动前台进程的时候需要传入一个id。
我们的做法是,首先启动我们自己所需要的前台服务。然后我们再次定义一个前台服务,这个服务什么事情都不做,然后我们随后启动这个服务,传入的id和我们所需的服务一样。这样本来是两个通知的,由于id一样,所以说只会有一个。 随后关闭这个服务,通知栏的的通知销毁。
不过有一个问题,在某些手机例如我这个华为手机,长摁右边的虚拟键,在任务管理器中把我们的进程杀死。会发现我们的前台服务依然运行。但是如果我们把前台服务的通知销毁,则这个操作会使这个前台服务被杀掉、

关于启动一个一像素activity的问题

我们知道,为了使a服务一直存在,我们启动了一个一像素activity,我们对锁屏解锁监听。锁屏启动,解锁关闭。但是,问题来了。当我们在打电话的时候,我们锁屏。当唤醒屏幕的时候,其实也解锁了。不过没有收到这个解锁的广播,只有一个唤醒的广播。这时候我们的一像素activity还在主界面上,这样就挡住了这个接打电话的界面。 我做的处理时,对唤醒屏幕的广播事件进行监听。如果当时是位于打电话的阶段,则把一像素activity关闭

百度鹰眼服务的保活

通常使用轨迹追踪的应用都需要长时间后台运行,如果遇到进程被系统杀死的情况,开发者该如何处理呢?
① 省电模式:若手机开启了省电模式、各手机厂商定制的优化模式(如小米手机的神隐模式)、第三方安全应用的省电模式(如360手机卫士),则进程可能会被杀死。 处理策略为,用户在手机端关闭省电模式,或将APP加入这些模式的白名单。
② 内存不足:当手机系统内存不足时,会回收进程,直至内存充足时系统会自动重启进程。针对这种情况,可在APP内新增一个独立的进程B,定时查询鹰眼serviceA是否是否出于开启状态。当监听到鹰眼进程A被杀死,则重新开启鹰眼服务。但如果进程B同时也被系统回收,则该方法失效。

③ doze 模式:Doze模式是Android6.0上新出的一种模式,是一种全新的、低能耗的状态,在后台只有部分任务允许运行,其他都被强制停止。当用户一段时间没有使用手机的时候,Doze模式通过延缓app后台的CPU和网络活动减少电量的消耗。若手机厂商生产的定制机型中使用到该模式,需要申请将app添加进白名单,可尽量帮助鹰眼服务在后台持续运行,代码如下:
// 在Android 6.0及以上系统,若定制手

对于不太要紧的服务请求

JobScheduler

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kotlin是一种基于Java虚拟机(JVM)的态类型编程语言,它可以用于开发各种应用程序,包括Android应用程序。前台服务是Android中一种特殊的服务类型,它可以在前台运行,并与用户进行交互。 在Kotlin中,你可以使用Android的Service类来创建前台服务。要创建一个前台服务,你需要执行以下步骤: 1. 创建一个继承自Service类的Kotlin类。 2. 在该类中重写onCreate()方法,在该方法中进行初始化工作。 3. 在onStartCommand()方法中编写服务的逻辑代码。这是服务被启动时调用的方法。 4. 在onDestroy()方法中释放资源和停止服务。 为了将服务设置为前台服务,你需要在onStartCommand()方法中调用startForeground()方法,并传递一个通知参数。这个通知将显示在系统状态栏上,并且用户可以通过点击通知与服务进行交互。 下面是一个简单的示例代码,展示了如何在Kotlin中创建一个前台服务: ```kotlin class MyForegroundService : Service() { override fun onCreate() { super.onCreate() // 初始化工作 } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { // 服务逻辑代码 startForeground(1, createNotification()) // 设置为前台服务 return START_STICKY } override fun onDestroy() { super.onDestroy() // 释放资源和停止服务 } private fun createNotification(): Notification { // 创建通知 // 设置通知的标题、内容、图标等 val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("Foreground Service") .setContentText("Service is running...") .setSmallIcon(R.drawable.ic_notification) .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setCategory(NotificationCompat.CATEGORY_SERVICE) return notificationBuilder.build() } override fun onBind(intent: Intent?): IBinder? { return null } } ``` 这是一个简单的前台服务示例,你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值