android-studio - Android中如何判断当前屏幕的状态?
黄舟
黄舟 2017-04-17 16:13:26
0
2
491

我想过监听系统广播,可是我在manifest.xml中声明了想要监听的广播类型,然后重写了onReceive()方法,以打印Log的方式检测是否正常工作,然而在控制台发现没有打印出信息。直接上图吧:


黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(2)
小葫芦

哥們你想在什麼情況下監聽螢幕狀態啊? ?

1.如果是要一直監聽就得開啟服務

Manifest中配置

        <!--广播接收者-->
        <receiver android:name=".receiver.ScreenStatusReceiver">
            <intent-filter>
                <action android:name="android.intent.action.SCREEN_OFF" />
                <action android:name="android.intent.action.SCREEN_ON" />
            </intent-filter>
        </receiver>

        <!--服务-->
        <service android:name=".service.PoService"/>

Service

public class PoService extends Service{
    int mStartMode;       // indicates how to behave if the service is killed
    IBinder mBinder;      // interface for clients that bind
    boolean mAllowRebind; // indicates whether onRebind should be used
    private ScreenStatusReceiver mReceiver;

    @Override
    public void onCreate() {
        final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);

        mReceiver = new ScreenStatusReceiver();
        registerReceiver(mReceiver, filter);
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // The service is starting, due to a call to startService()
        return mStartMode;
    }
    @Override
    public IBinder onBind(Intent intent) {
        // A client is binding to the service with bindService()
        return mBinder;
    }
    @Override
    public boolean onUnbind(Intent intent) {
        // All clients have unbound with unbindService()
        return mAllowRebind;
    }
    @Override
    public void onRebind(Intent intent) {
        // A client is binding to the service with bindService(),
        // after onUnbind() has already been called
    }
    @Override
    public void onDestroy() {
        // The service is no longer used and is being destroyed
        if (mReceiver != null) {
            unregisterReceiver(mReceiver);
            mReceiver = null;
        }
    }
}

BroadcastReceiver

public class ScreenStatusReceiver extends BroadcastReceiver {
    public static boolean wasScreenOn = true;

    @Override
    public void onReceive(final Context context, final Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            wasScreenOn = false;
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            wasScreenOn = true;
        }
    }
}

日誌

03-16 21:57:22.950 30953-30953/wang.wangxinarhat.materialdesigncomprehensivesamples E/ScreenStatusReceiver: 屏幕关闭
03-16 21:57:23.979 30953-30953/wang.wangxinarhat.materialdesigncomprehensivesamples E/ScreenStatusReceiver: 屏幕点亮
03-16 21:57:26.584 30953-30953/wang.wangxinarhat.materialdesigncomprehensivesamples E/ScreenStatusReceiver: 屏幕关闭
03-16 21:57:28.485 30953-30953/wang.wangxinarhat.materialdesigncomprehensivesamples E/ScreenStatusReceiver: 屏幕点亮
03-16 21:57:31.021 30953-30953/wang.wangxinarhat.materialdesigncomprehensivesamples E/ScreenStatusReceiver: 屏幕关闭
03-16 21:57:32.393 30953-30953/wang.wangxinarhat.materialdesigncomprehensivesamples E/ScreenStatusReceiver: 屏幕点亮

2.如果不是,給你舉個在Activity中取得螢幕狀態的栗子

Activity

public class ScreenStatusActivity extends BaseActivity {
    private BroadcastReceiver mReceiver = null;

    public static Intent getStartIntent() {
        Intent intent = new Intent();
        intent.setClass(BaseApplication.getApplication(), ScreenStatusActivity.class);
        return intent;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);

        mReceiver = new ScreenStatusReceiver();
        registerReceiver(mReceiver, filter);
    }

    @Override
    protected void onPause() {

        if (ScreenStatusReceiver.wasScreenOn) {

            Log.e(ScreenStatusActivity.class.getSimpleName(), "屏幕点亮");
        } else {
            Log.e(ScreenStatusActivity.class.getSimpleName(), "屏幕关闭");
        }
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (ScreenStatusReceiver.wasScreenOn) {
            Log.e(ScreenStatusActivity.class.getSimpleName(), "屏幕点亮");
        } else {
            Log.e(ScreenStatusActivity.class.getSimpleName(), "屏幕关闭");
        }
    }

    @Override
    protected void onDestroy() {
        if (mReceiver != null) {
            unregisterReceiver(mReceiver);
            mReceiver = null;
        }
        super.onDestroy();
    }

}

日誌

03-16 21:14:03.112 3803-3803/wang.wangxinarhat.materialdesigncomprehensivesamples E/ScreenStatusActivity: 屏幕点亮
03-16 21:14:09.583 3803-3803/wang.wangxinarhat.materialdesigncomprehensivesamples E/ScreenStatusActivity: 屏幕关闭
03-16 21:14:26.686 3803-3803/wang.wangxinarhat.materialdesigncomprehensivesamples E/ScreenStatusActivity: 屏幕点亮
03-16 21:14:41.576 3803-3803/wang.wangxinarhat.materialdesigncomprehensivesamples E/ScreenStatusActivity: 屏幕关闭

這部分程式碼放到了github

左手右手慢动作

Service中使用廣播和Activity一樣,onCreate中註冊,onDestroy解綁就是了。只是Intent.ACTION_SCREEN_ONIntent.ACTION_SCREEN_OFF這兩個廣播比較特殊,不能靜態註冊,只能動態註冊,即,你在manifest中註冊這個廣播監聽是不管用的,這就是為什麼你自己寫的demo打印不出來log的原因。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!