为了程序退出后service保活

程序退出后service保活

先擤两把鼻涕,我的内心在哭泣。。。。。。(目前还在处于探索状态(百度ing…))
**运行手机:**华为nova 3i ,好像是安卓9.0

回合一:
PowerManager.WakeLock m_wklk;
在onCreate()中

 m_wklk = null;
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        m_wklk = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TestService.class.getName());
        if (null != m_wklk){
            m_wklk.acquire();
        }

在onDestroy中

if (m_wklk != null) {
        m_wklk.release();
        m_wklk = null;
    }

AndroidManifest中

<uses-permission android:name="android.permission.WAKE_LOCK" />

测试结果:点击home,运行一小会会,我看到了亲切的 onDestory >_<、

回合二:
在onCreate()中

 AlarmManager manager;= (AlarmManager) getSystemService(ALARM_SERVICE);
 int aMiniute =  2*60*1000; // 这是一分钟的毫秒数
  long triggerAtTime = SystemClock.elapsedRealtime() + aMiniute;

 Intent i = new Intent(this, AlarmReceiver.class);
 PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
 manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);

在onDestroy中

manager.cancel(pi);

AlarmReceiver :

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("Test", "c重启服务onStart TestService .......... ");
          Intent i = new Intent(context, TestService.class);
        context.startService(i);
    } }

记得注册AlarmReceiver 和 Service

参考:Android 开发 AlarmManager 定时器
https://blog.csdn.net/qq_37217804/article/details/82665097

Intent立即响应; pendingintent 类似发送短信,邮件等

*PendingIntent的第四个参数的说明:

  • 常量:
  • FLAG_CANCEL_CURRENT 生成一个新的对象
  • FLAG_NO_CREATE若不存在,则创建一个新的对象
  • FLAG_ONE_SHOT创建的对象只能使用一次
  • FLAG_UPDATE_CURRENT已存在则直接使用

PendingIntent 的使用 以及其中参数的理解
https://blog.csdn.net/qq_38340601/article/details/82930108

隔一段时间AlarmReceiver 可以startService(),但是一段时间(几分钟后)还是onDestory 了。。。。。。。。。。。

我不晓得啥子,方方的。。。。。。。
哪位大神路过,求指教,跪谢。。。。。

经过一下午的摸索,终于找到了解决办法。
参考这位大佬的文章 已经毕业的C先生
定时AlarmManager循环执行后台任务和多个定时循环后台任务写在一起

依旧是用AlarmManager,原因猜测应该是安卓版本导致的 问题。目前实现的程度应该是,点击home键,程序中的service可以在后台运行,点击一键清理应该就结束了。
版本判断如下:(具体参考上面的链接)

       int apiLevel = getApiLevel();
        if (apiLevel < Build.VERSION_CODES.KITKAT) {
            Log.d("api<19", "setExactAlarmCompat ");
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), INTERVAL_TIME, pIntent);
        } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                alarmManager.setExact(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pIntent);
            }
            Log.d("19<api<23", "setExactAlarmCompat ");
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pIntent);
            Log.d("api>23", "setExactAlarmCompat ");
        }
————————————————
版权声明:本文为CSDN博主「已经毕业的C先生」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cqx13763055264/article/details/79146187
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值