当应用程序未运行时,ANDROID 中用于屏幕开/关的广播接收器

San*_*shi 6 android broadcastreceiver

我想检测屏幕关闭和打开事件,因为我创建了 BroadcastReceiver,它仅在应用程序运行时才能正常工作,而当我从任务管理器中删除该应用程序时,它就不起作用。

活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    try{
        BroadcastReceiver myrcver  = new BootReceiver();
        IntentFilter screenStateFilter = new IntentFilter();
        screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
        screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
        registerReceiver(myrcver, screenStateFilter);
    }
    catch (Exception e){
        e.fillInStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

梅尼弗斯特:

<receiver
        android:name=".BootReceiver"
        android:enabled="true"
        android:exported="true"
        android:label="BootReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.SCREEN_OFF" />
            <action android:name="android.intent.action.SCREEN_ON" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

广播接收器:

public class BootReceiver extends BroadcastReceiver {
boolean screenOff;
@Override
public void onReceive(Context context, Intent intent) {
    try {
        if ("android.intent.action.SCREEN_ON".equals(intent.getAction())) {
            if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                screenOff = true;
            } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                screenOff = false;
            }
            Intent i = new Intent(context, UpdateService.class);
            i.putExtra("screen_state", screenOff);
            context.startService(i);
        }
    }
    catch (Exception e){
        e.fillInStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

}

提前感谢您的帮助。

Coo*_*ter 7

如果您希望它在后台运行,即使应用程序没有运行,您也必须创建一个服务。在服务类中,您必须向您的接收器注册。

public class ScreenOnOffService extends Service {

    private ScreenOnOffReceiver mScreenReceiver;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        registerScreenStatusReceiver();
    }

    @Override
    public void onDestroy() {
        unregisterScreenStatusReceiver();
    }

    private void registerScreenStatusReceiver() {
        mScreenReceiver = new ScreenOnOffReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_SCREEN_ON);
        registerReceiver(mScreenReceiver, filter);
    }

    private void unregisterScreenStatusReceiver() {
        try {
            if (mScreenReceiver != null) {
                unregisterReceiver(mScreenReceiver);
            }
        } catch (IllegalArgumentException e) {}
    }
}
Run Code Online (Sandbox Code Playgroud)

创建服务类后,不要忘记将您的服务添加到清单中:

<service android:name="com.myapp.services.ScreenOnOffService" />
Run Code Online (Sandbox Code Playgroud)

然后要启动服务,您可以在主要活动中编写以下内容:

Intent intent = new Intent(this, ScreenOnOffService.class);
startService(intent);
Run Code Online (Sandbox Code Playgroud)

对于广播类:

public class ScreenOnOffReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            Log.d("StackOverflow", "Screen Off");

        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            Log.d("StackOverflow", "Screen On");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:对我来说,screen offscreen on,在清单中不起作用,但仅在运行时起作用