2019-08-10 09:48:22 qq_31339141 阅读数 1089
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    26374 人正在学习 去看看 任苹蜻
// 监听熄屏和亮屏需要添加权限
<uses-permission android:name="android.permission.DEVICE_POWER"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />

public class PowerScreenReceiver extends BroadcastReceiver {
    private static final String TAG = "PowerScreenReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
            Log.i(TAG, "receive screen off");
        } else if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
            Log.i(TAG, "receive screen on");
        }
    }
}

// 需要使用动态注册才能接收到广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
PowerScreenReceiver receiver = new PowerScreenReceiver();
registerReceiver(receiver, intentFilter);

// 屏幕主动唤醒,在普通的应用apk中调用可能无效,在实际项目开发系统apk时能正常唤醒待机状态的TV屏幕
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
boolean isScreenOn;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
    isScreenOn = powerManager.isInteractive();
} else {
    isScreenOn = powerManager.isScreenOn();
}
if (!isScreenOn) {
    @SuppressLint("InvalidWakeLockTag") PowerManager.WakeLock wakeLock = powerManager.newWakeLock(
            PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "wakeupScreen");
    if (wakeLock != null) {
        wakeLock.acquire(1000);
        wakeLock.release();
    }
}

// 手动进入待机,同样只有系统apk有效
 PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
try {
    powerManager.getClass().getMethod("goToSleep", long.class).invoke(powerManager, SystemClock.uptimeMillis());
} catch (Exception e) {
    e.printStackTrace();
}
2018-11-27 17:47:21 w1764662543 阅读数 1933
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    26374 人正在学习 去看看 任苹蜻

平台 MTK
android版本 8.1

主动显示功能

谷歌在android 6.0之后有一个主动显示的功能,如果设备支持这个功能的话,直接设置这个功能默认打开就可以了,因为正常唤醒屏幕的操作是会影响手机功耗的.
对应的Setting属性
(./base/core/java/android/provider/Settings.java)
在定制的时候默认打开就可以,这种显示,手机在收到短信(或其他)通知后,不会完全亮屏,谷歌自家的手机就是默认打开该功能,设置项在"setting>display>Ambient dispaly"

        /**
         * Whether the device should doze if configured.
         * @hide
         */
         public static final String DOZE_ENABLED = "doze_enabled";

        /**
         * Whether doze should be always on.
         * @hide
         */
        public static final String DOZE_ALWAYS_ON = "doze_always_on";

        /**
         * Whether the device should pulse on pick up gesture.
         * @hide
         */
        public static final String DOZE_PULSE_ON_PICK_UP = "doze_pulse_on_pick_up";

唤醒亮屏

有的项目不支持主动显示功能,如果还需要心亮屏,就只能完全唤醒,当显示通知的时候,亮屏到锁屏界面
参照MTK online上的修改,不过由于是7.0,代码有点差异,我们需要修改一下。

[FAQ20202] 当手机灭屏时,定制来短信或者微信亮屏时间
内容 (2017-07-25)
[DESCRIPTION]
手机灭屏之后,来短信或者信息亮屏7s之后再黑屏。
[SOLUTION]
Android N上验证:

这个修改为客制化的需求,可以在BaseStatusBar.java定义一个wakelock,并初始化:
import android.os.PowerManager;
private PowerManager.WakeLock mNotificationWakeLock;

mNotificationWakeLock = mPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, TAG);
mNotificationWakeLock.setReferenceCounted(false);

方案一:
在addNotificationViews和updateNotificationViews里面添加如下亮屏请求。当来了一条新通知或者更新一条通知的时候都会走到这两个逻辑:
//added MTK
if (!mPowerManager.isScreenOn() && entry.key != null && entry.key.contains(“com.android.mms”)){//可以根据需要亮屏的应用,增加不同的包名判断。
mNotificationWakeLock.acquire(5000);
Log.d(TAG, “special app notification turn screen on”);
}
//added end

android 8.1 修改一下

+    private PowerManager.WakeLock mNotificationWakeLock;

+    private void screenWakeUp(Entry entry) {
+        if(mNotificationWakeLock == null){
+            mNotificationWakeLock = mPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, TAG);
+            mNotificationWakeLock.setReferenceCounted(false);
+        }
+        if (!mPowerManager.isScreenOn() && entry.key != null && entry.key.contains("com.google.android.apps.messaging")) {
+            mNotificationWakeLock.acquire(5000);
+            Log.d(TAG, "special app notification turn screen on");
+        }
+    }
+
     protected void addNotificationViews(Entry entry) {
         if (entry == null) {
             return;
         }
         // Add the expanded view and icon.
         mNotificationData.add(entry);
+       screenWakeUp(entry);
         updateNotifications();
     }
 
 protected void updateRowStates() {
         final int N = mStackScroller.getChildCount();
 
         int visibleNotifications = 0;
         boolean onKeyguard = mState == StatusBarState.KEYGUARD;
         int maxNotifications = -1;
         if (onKeyguard) {
             maxNotifications = getMaxKeyguardNotifications(true /* recompute */);
         }
         mStackScroller.setMaxDisplayedNotifications(maxNotifications);
         Stack<ExpandableNotificationRow> stack = new Stack<>();
         for (int i = N - 1; i >= 0; i--) {
@@ -7605,36 +7619,37 @@ public class StatusBar extends SystemUI implements DemoMode,
 
         Notification n = notification.getNotification();
         mNotificationData.updateRanking(ranking);
 
         final StatusBarNotification oldNotification = entry.notification;
         entry.notification = notification;
         mGroupManager.onEntryUpdated(entry, oldNotification);
 
         entry.updateIcons(mContext, notification);
         inflateViews(entry, mStackScroller);
 
         mForegroundServiceController.updateNotification(notification,
                 mNotificationData.getImportance(key));
 
         boolean shouldPeek = shouldPeek(entry, notification);
         boolean alertAgain = alertAgain(entry, n);
 
         updateHeadsUp(key, entry, shouldPeek, alertAgain);
+       screenWakeUp(entry);
         updateNotifications();
 
         if (!notification.isClearable()) {
             // The user may have performed a dismiss action on the notification, since it's
             // not clearable we should snap it back.
             mStackScroller.snapViewIfNeeded(entry.row);
         }
 
         if (DEBUG) {
             // Is this for you?
             boolean isForCurrentUser = isNotificationForCurrentProfiles(notification);
             Log.d(TAG, "notification is " + (isForCurrentUser ? "" : "not ") + "for you");
         }
 
         setAreThereNotifications();
     }
2015-05-06 22:59:31 silenceshining 阅读数 1521
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    26374 人正在学习 去看看 任苹蜻

http://www.cnblogs.com/tianzhijiexian/p/4154056.html

我们在做电子阅读器的时候可能会要求屏幕保持常亮,不希望它熄灭。它的原理也是利用系统服务,来操纵底层设备。

一、系统服务——PowerManager

PowerManager.java就是管理我们电源方面的功能的,当然也包括我们屏幕的亮和熄灭。

 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);

PowerManager pm = (PowerManager)getSystemService(POWER_SERVICE);// init powerManager

因为PowerManager是系统服务,所以它的生命周期不是应用程序所能控制的;应用程序只能通过系统,向系统请求获取PowerManager服务,然后系统把这个服务的应用给我们用。

 

二、PowerManager.WakeLock

这个内部类可以真正实现控制屏幕

类型 cpu 屏幕 键盘
PARTIAL_WAKE_LOCK on off off
SCREEN_DIM_WAKE_LOCK on dim off
SCREEN_BRIGHT_WAKE_LOCK on Bright off
FULL_WAKE_LOCK on Bright Bright

由于它定义了这么多类型,每种类型可以指定相对应的部件工作和不工作。那么我们就可以利用这些类型,从最细粒度来控制我们的屏幕,控制我们的电源,从而让我们的电源工作时间尽可能的延长。

 

三、实际运用

1. 首先加入权限

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

 

2. 进行初始化

    private PowerManager.WakeLock mWakelock;
PowerManager pm = (PowerManager)getSystemService(POWER_SERVICE);// init powerManager
        mWakelock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP|
                PowerManager.SCREEN_DIM_WAKE_LOCK,"target"); // this target for tell OS which app control screen

 

3. 强制亮屏

mWakelock.acquire(); // Wake up Screen and keep screen lighting

 

4. 取消强制亮屏,释放控制

mWakelock.release(); // release control.stop to keep screen lighting

PS:这里需要注意的是acquire和release必须成对使用

 

5. 有一种情况是类似于来电显示,我们不仅需要让屏幕点亮,而且还想要取消锁屏界面,该怎么做呢?

在AndroidManifest.xml中加上permission 权限:

<uses-permissionandroid:name="android.permission.DISABLE_KEYGUARD" />
复制代码
    // 键盘锁管理器对象
        KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        // 这里参数”kale”作为调试时LogCat中的Tag
        KeyguardLock kl = km.newKeyguardLock("kale");
        if (km.inKeyguardRestrictedInputMode()) {  
             // 解锁键盘  
             kl.disableKeyguard(); 
         }  
复制代码

 

6. 在新版本中上面的代码变得不推荐了,系统给在activity显示时保持常亮提供了一个新的方法,使用方法也相当简单,下面这句只需要加在activity中即可。

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

 

参考自:

http://blog.csdn.net/pku_android/article/details/7596968

http://bbs.51cto.com/thread-1018050-1.html


2016-02-20 21:46:14 u013037007 阅读数 4440
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    26374 人正在学习 去看看 任苹蜻
主动判断屏幕是否亮着:

public boolean isScreenOn(Context context) { 
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
    if (pm.isScreenOn()) { 
        return true; 
    } 

    return false; 

//屏幕解锁 
KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE); 
KeyguardLock keyguardLock = keyguardManager.newKeyguardLock(LOCK_TAG); 
keyguardLock.disableKeyguard(); 
//屏幕锁定 
keyguardLock.reenableKeyguard(); 


KeyguardManager km= (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);  
        KeyguardManager.KeyguardLock kl = km.newKeyguardLock("unLock");  
        //解锁  
        kl.disableKeyguard();  
        //获取电源管理器对象  
        PowerManager pm=(PowerManager) context.getSystemService(Context.POWER_SERVICE);  
        //获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是LogCat里用的Tag  
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK,"bright");  
        //点亮屏幕  
        wl.acquire();  
        //释放  
        wl.release();  

2015-02-11 17:17:30 u010687392 阅读数 2961
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    26374 人正在学习 去看看 任苹蜻

开发后台服务的时候经常需要对屏幕状态进行判断,如果是想要监听屏幕解锁事件,可以在配置里面注册action为 android.intent.action.USER_PRESENT的广播,则可以监听解锁事件。但有时候,在后台执行某个操作时,需要主动判断屏幕的状态,比如是否是亮着的,可以使用PowerManager的isScreenOn方法进行判断,比如屏幕是否开启了自动旋转等。

注册监听解锁广播:

1
2
3
4
5
<receiver android:name="com.home.testscreen.MyReceiver"
            <intent-filter
                <action android:name="android.intent.action.USER_PRESENT" /> 
            </intent-filter
        </receiver>


MyReceiver:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.home.testscreen; 
   
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.widget.Toast; 
   
public class MyReceiver extends BroadcastReceiver { 
   
    @Override 
    public void onReceive(Context context, Intent intent) { 
        // 解锁 
        if (intent != null 
                && Intent.ACTION_USER_PRESENT.equals(intent.getAction())) { 
            Toast.makeText(context, "屏幕已解锁", Toast.LENGTH_SHORT).show(); 
        
    
   
}

主动判断屏幕是否亮着:

1
2
3
4
5
6
7
public boolean isScreenOn(Context context) { 
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
    if (pm.isScreenOn()) { 
        return true
    
    return false
}


判断是否开启了重力感应:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * 是否开启了重力感应
 * @param context
 * @return
 */ 
public boolean screenIsOpenRotate(Context context) { 
    int gravity = 0
    try 
        gravity = Settings.System.getInt(context.getContentResolver(), 
                Settings.System.ACCELEROMETER_ROTATION); 
    catch (SettingNotFoundException e) { 
        e.printStackTrace(); 
    
    if (gravity == 1) { 
        return true
    
    return false
}
没有更多推荐了,返回首页