Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在屏幕解锁时启动应用程序?_Android_Broadcastreceiver_Screen Lock - Fatal编程技术网

Android 如何在屏幕解锁时启动应用程序?

Android 如何在屏幕解锁时启动应用程序?,android,broadcastreceiver,screen-lock,Android,Broadcastreceiver,Screen Lock,我已经尝试过这个代码,但它不起作用。有人有不同的解决方案吗?我已经尝试了很多方法,比如下面的Stack Overflow方法,但是没有一种有效 manifest.xml <receiver android:name=".ScreenReceiver"> <intent-filter> <action android:name="android.intent.action.SCREEN_OFF"/> <action android:name="an

我已经尝试过这个代码,但它不起作用。有人有不同的解决方案吗?我已经尝试了很多方法,比如下面的Stack Overflow方法,但是没有一种有效

manifest.xml

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

要收听屏幕开/关,您的应用程序应按时间运行,并以编程方式将广播接收器注册到操作系统

ScreenOnOffService.java

public class ScreenOnOffService extends Service {

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

    public void onCreate() {
        super.onCreate();
        Log.i("ScreenOnOffService", "onCreate: ");
        IntentFilter intentFilter = new IntentFilter();
//        intentFilter.addAction("android.intent.action.SCREEN_OFF");
        intentFilter.addAction("android.intent.action.SCREEN_ON");
        registerReceiver(ScreenOnReceiver.newInstance(), intentFilter);
    }

    public void onDestroy() {
        super.onDestroy();
        Log.i("ScreenOnOffService", "onDestroy: ");
        unregisterReceiver(ScreenOnReceiver.newInstance());
//        startService(new Intent(this,ScreenOnOffService.class));
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return Service.START_STICKY;
    }

}
ScreenOnReceiver.java

public class ScreenOnReceiver extends BroadcastReceiver {

    public static final String TAG = "ScreenOn";
    public static volatile ScreenOnReceiver screenOn;

    public static ScreenOnReceiver newInstance() {
        if (screenOn == null) {
            screenOn = new ScreenOnReceiver();
        }
        return screenOn;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("hieuN", "intent: " + intent.getAction());
        // do work. start activity.

    }
}
在活动中启动服务

Intent service = new Intent(this, ScreenOnOffService.class);
startService(service);

屏幕打开或关闭无法再列入清单。您应该运行前台服务并通过代码注册ScreenReceiver,然后它就会工作。您可以用代码示例解释一下吗@海军上将:除非这项服务几乎马上就被杀,否则它就不可靠了。前台服务会让情况变得更糟。但最终,没有真正的方法来保证你能可靠地听屏幕的开或关。@GabeSechan是的。将服务设为前台,几乎不可关闭,它将解决问题。它只在我最小化应用程序并锁定屏幕时起作用。但是,当我完全退出应用程序,并从最小化中销毁它时,它就不起作用了@AdmiralKunkka@AqibAbbas因为当你刷掉它的时候,服务被终止,因此没有注册的侦听器。即使在这种情况下,在现代版本的Android上也不可能一直听下去。您的应用程序需要运行。@AqibAbbas将ScreenOnReceiver.java更改为前台服务,然后当您刷出时,它仍能工作。只是不适合中国手机。
Intent service = new Intent(this, ScreenOnOffService.class);
startService(service);