【问题标题】:How to start a lockscreen activity instantaneously after reboot?重启后如何立即启动锁屏活动?
【发布时间】:2016-01-13 10:46:39
【问题描述】:

我想在设备重新启动后与启动通知(如消息、Viber 通知、Whatsapp 等)并排启动锁屏活动。如何做到这一点??我制作了一个接收 BOOT_COMPLETED 操作的广播接收器,然后它启动一个服务,该服务再次使用 Intent.ACTION_SCREEN_OFF 和 Intent.ACTION_SCREEN_ON 意图过滤器注册相同的接收器,并且该接收器启动锁屏活动。这是我的代码:

AndroidManifest.xml

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

<receiver>
       <intent-filter android:priority="2147483647">
            <action android:name="android.intent.action.BOOT_COMPLETED" />
       </intent-filter>
</receiver>

当然,我在清单中声明了服务。

这是我的广播接收器类

public class LockScreenBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
  Log.d("BroadCastReceiver", "ReceivedIntent");

  if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {

  Intent myIntent = new Intent(context, LockScreenActivity.class);
  myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  myIntent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

  if (!LockScreenActivity.isActivityRunning) {
    context.startActivity(myIntent);
  }else{
    Log.d("BroadCasrReceiver","LockScreenActivity is running");
  }

  }else if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
  Log.v("LockScreenBroadReceiver","boot completed");
  Intent startServiceIntent = new Intent(context,LockScreenService.class);             
  context.startService(startServiceIntent);
 }
}
}

和服务等级:

公共类 LockScreenService 扩展服务 {

LockScreenBroadCastReceiver broadCastReciever;
public static boolean isRunning;

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

@Override
public void onCreate() {
    super.onCreate();
    isRunning = true;
    registerReceiver();
}

@Override
public void onDestroy() {
    super.onDestroy();
    isRunning = false;
    unregisterReceiver(broadCastReciever);
    Log.d("LockScreenReceiver", "ReceiverUnregistered");
    sendBroadcast(new Intent("RestartLockScreenService"));
}

private void registerReceiver(){
    IntentFilter intentFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
    intentFilter.addAction(Intent.ACTION_SCREEN_ON);
    broadCastReciever = new LockScreenBroadCastReceiver();
    registerReceiver(broadCastReciever,intentFilter);
    Log.d("LockScreenReceiver", "ReceiverRegistered");
 }
}

这种方法是有效的。但是,它非常慢,因为广播接收器会监听 BOOT_COMPLETED 广播,该广播会等待设备完全启动并工作。因此,您可以在锁屏工作之前多次锁定和解锁手机。有什么想法吗??

【问题讨论】:

    标签: android-activity service broadcastreceiver lockscreen


    【解决方案1】:

    您可以像这样在清单中使用 BootComplate 的 intentFilter 实例:

    <action android:name="android.intent.action.USER_PRESENT" />
    

    【讨论】:

    • 感谢您的回答。不幸的是,这没有奏效,启动后仍有一些延迟,用户必须在我的自定义锁屏活动之前锁定和解锁手机 2-3 次出现。
    【解决方案2】:

    我有同样的问题。它已通过包含

    修复
    <category android:name="android.intent.category.DEFAULT" />
    

    在接收器上。这是我试图缩小范围的重新启动时的 6 秒轻微延迟。

    我希望这对你有用

    【讨论】:

    • 感谢您的帮助! .我的情况也是如此,现在我的平均延迟为几秒钟,正如你提到的。我也使用这个 xml 标签。我试图通过在某处搜索一些教程来获得更好的结果。我觉得关于这个主题的文档不多。如果你找到一个好的,请转发给我。
    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    相关资源
    最近更新 更多