美文网首页
后台服务保持设备唤醒状态

后台服务保持设备唤醒状态

作者: zsj1225 | 来源:发表于2017-06-18 01:07 被阅读566次

    1)保持CPU 运行,WakeLock

    系统为了节省电量,CPU在没有任务忙的时候就会自动进入休眠。
    这时候想执行任务。就要给CPU加wake_lock锁来唤醒CPU高效执行。

    注意:唤醒CPU(给CPU加Wake_lock)来工作。记得释放wake_lock.

    示例:
    // 获取电源管理者
            pw = (PowerManager) getSystemService(POWER_SERVICE);
    //获取Wake_Lock
            mWakeLock = pw.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"myWake_lock");
    //唤醒CPU
    mWakeLock.acquire();
    //执行任务
    mWakelock.release();//记得释放CPU锁
    

    要加上唤醒CPU权限

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

    判断网络连接

        //判断是否有网络
    public boolean isConn() {
                // 获取网络连接管理者
                ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
                // 获取网络信息
                NetworkInfo activeNetworkInfo = connManager.getActiveNetworkInfo();
                // 判断是不是连接网络
                return activeNetworkInfo != null && activeNetworkInfo.isConnected();
            }
    

    记得加上权限。网络权限和获取网络状态权限

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

    缺点:创建和持有唤醒锁对电池的续航有较大的影响创建和持有唤醒锁对电池的续航有较大的影响。

    推荐使用方式:
    使用WakefulBroadcastReceiver:使用广播和Service(典型的IntentService)结合的方式可以让你很好地管理后台服务的生命周期使用WakefulBroadcastReceiver:使用广播和Service(典型的IntentService)结合的方式可以让你很好地管理后台服务的生命周期

    WakefulBroadcastReceiver和IntentService结合使用示例:

    使用WakefulBroadcastReceiver第一步就是在Manifest中注册:

      <receiver android:name=".SimpleWakefulReceiver" />
    

    在WakefulBroadcastReceiver的中用startWakefulService()启动服务,与startService()相比,在启动服务的同时,并启用了唤醒锁。
    package com.netraffic.wakefulreceiverdemo;

    import android.content.Context;
    import android.content.Intent;
    import android.support.v4.content.WakefulBroadcastReceiver;
    
    /**
     * 创建者     朱胜军
     * 创建时间   2017/6/18 0:28
     */
    public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
           //启动服务,在设备保持设备唤醒的同时启动。 这是提供服务的意图。
            startWakefulService(context, new Intent(context, MyIntentService.class));
        }
    }
    

    创建IntentService做耗时操作。昨晚耗时操作,调用WakefulBroadcastReceiver.completeWakefulIntent()来释放唤醒锁。来释放唤醒锁。

    //在Manifest中注册服务
    package com.netraffic.wakefulreceiverdemo;
    
    import android.app.IntentService;
    import android.content.Intent;
    import android.os.SystemClock;
    import android.util.Log;
    
    /**
     * 创建者     朱胜军
     * 创建时间   2017/6/18 0:28
     */
    public class MyIntentService extends IntentService {
    
        public MyIntentService() {
            super("MyIntentService");
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
            //执行需要您的应用程序来保持CPU运行的工作。
            // ...
            for (int i = 0; i < 50; i++) {
                SystemClock.sleep(50);
                Log.d("zsj", "zsj onHandleIntent = " + i);
            }
            //释放WakefulBroadcastReceiver提供的唤醒锁。
            SimpleWakefulReceiver.completeWakefulIntent(intent);
        }
    }
    

    触发WakefulBroadcastReceiver

    //发送广播触发WakefulBroadcastReceiver
            sendBroadcast(new Intent(MainActivity.this, SimpleWakefulReceiver.class));
    

    2)保持屏幕常亮

    在Activity中使用FLAG_KEEP_SCREEN_ON 的Flag

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    

    取消屏幕常亮

    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    

    3)采用定时重复的开启Service

    利用Android自带的定时器AlarmManager实现
    示例:

            Intent intent = new Intent(MainActivity.this, SimpleWakefulReceiver.class);
            PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0,
                    intent, 0);
    
            // We want the alarm to go off 30 seconds from now.
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            calendar.add(Calendar.SECOND, 30);
    
            // Schedule the alarm!
            AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
            am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
    
            // Tell the user about what we did.
            if (mToast != null) {
                mToast.cancel();
            }
            mToast = Toast.makeText(MainActivity.this, "安排完毕", Toast.LENGTH_LONG);
            mToast.show();
    

    总结:

    1.在关键逻辑的执行过程中,就需要Wake Lock来保护。
    2.休眠的情况下如何唤醒来执行任务?用AlarmManager进行定时唤醒。

    相关文章

      网友评论

          本文标题:后台服务保持设备唤醒状态

          本文链接:https://www.haomeiwen.com/subject/uwxiqxtx.html