且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

机器人:广播接收机的屏幕上,屏幕关闭

更新时间:2023-11-19 14:19:28

这两个动作的画面和关闭是:

  android.intent.action.SCREEN_OFF
android.intent.action.SCREEN_ON
 

但是,如果你在一个清单注册一个接收器,这些广播,则接收器将不会收到这些广播。

对于这个问题,你必须创建一个长时间运行的服务,这是注册一个地方广播接收这些意图。如果你这样做的方式,那么你的应用程序将寻找屏幕关闭,只有当你的服务运行,不会激怒用户。

PS:启动该服务的前台,使之运行时间

一个简单的code段将是这样的:

 的IntentFilter screenStateFilter =新的IntentFilter();
screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mScreenStateReceiver,screenStateFilter);
 

不要忘记注销接收器在服务的的的的onDestroy 的:

  unregisterReceiver(mScreenStateReceiver);
 

I was just wondering if it is possible to register a broadcast receiver that detects Screen ON/OFF in the application manifest. The reason why I don't like the programmable method is that it requires the app to be running in order to detect such a thing, while: "Applications with Broadcast Receivers registered in the manifest don’t have to be running when the Intent is broadcast for the receivers to execute" (source: Professional Android 2 Application Development book)

My app is actually a lockscreen app which by using the programmable way needs to be running all the time :S

Is there a way around it?

I'm trying the following in the manifest:

<receiver android:name=".MyBroadCastReciever">
    <intent-filter>
        <action android:name="android.intent.action.SCREEN_OFF"/>
        <action android:name="android.intent.action.SCREEN_ON"/>
    </intent-filter>
</receiver>

and simple MyBroadCastReciever class:

public class MyBroadCastReciever extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            Log.i("Check","Screen went OFF");
            Toast.makeText(context, "screen OFF",Toast.LENGTH_LONG).show();
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            Log.i("Check","Screen went ON");
            Toast.makeText(context, "screen ON",Toast.LENGTH_LONG).show();
        }
    }
}

The two actions for screen on and off are:

android.intent.action.SCREEN_OFF
android.intent.action.SCREEN_ON

But if you register a receiver for these broadcasts in a manifest, then the receiver will not receive these broadcasts.

For this problem, you have to create a long running service, which is registering a local broadcast receiver for these intents. If you do this way, then your app will look for screen off only when your service is running which won't irritate user.

PS: start the service in foreground to make it running longer.

A simple code snippet will be something like this:

IntentFilter screenStateFilter = new IntentFilter();
screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mScreenStateReceiver, screenStateFilter);

Don't forget to unregister the receiver in the Service's onDestroy:

unregisterReceiver(mScreenStateReceiver);