简体   繁体   English

在自定义通知单击时提示解锁锁定屏幕

[英]Prompt to unlock lock screen on custom notification click

I have a custom notification shown in the lock screen. 我在锁定屏幕中显示了自定义通知。 I am using a broadcast pending intent to send a message to my app once the notification is clicked. 单击通知后,我正在使用广播待定意图向我的应用发送消息。 Which later starts an activity in the broadcast receiver. 后来在广播接收器中开始活动。

The problem is, once I click on the notification, it disappears from the lock-screen and the activity is launched behind the lock-screen. 问题是,一旦我点击通知,它就会从锁定屏幕上消失,并且活动会在锁定屏幕后面启动。 It does not ask the user to unlock the screen. 它不会要求用户解锁屏幕。

My requirement is to ask the user to unlock the screen as soon as the broadcast is sent by the notification's click event. 我的要求是在通知的点击事件发送广播后立即要求用户解锁屏幕。 How do I do that? 我怎么做?

I could find this question which looks like my problem. 我可以找到这个看起来像我的问题的问题。 But unfortunately there is no answer. 但不幸的是没有答案。

Here is some code that explains the notification creation I did. 以下是一些解释我所做通知创建的代码。

/**
 * Method to render Notification
 */
private void showNotification() {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    /* set mandatory stuff on builder */

    Notification notification = builder.build();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        notification.bigContentView = createCustomView(context);
    }

    NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    manager.notify(getNotificationId(), notification);
}

/**
 * Method to return notification click's PendingIntent
 */
private PendingIntent getNotificationClickIntent() {
    Intent bcIntent = new Intent(OPEN_APP);
    bcIntent.putExtra(EXTRA_DEEP_LINK_URL, getDeepLinkUrl());

    return PendingIntent.getBroadcast(
        context, getReqCode(), bcIntent, PendingIntent.FLAG_ONE_SHOT);
}

/**
 * Method to create custom view for notification
 */
private RemoteViews createCustomView(Context context) {
   RemoteViews customView = new RemoteViews(context.getPackageName(), R.layout.custom_layout);

   if (customView != null) {
        // set dat on views

        customView.setOnClickPendingIntent(R.id.my_view, getNotificationClickIntent());
   }

   return customView;
}

Use Activity intent in pending intent instead of Service or Broadcast 在待定意图中使用活动意图而不是服务或广播

PendingIntent.getActivity(context, 0, intent,
                                 PendingIntent.FLAG_UPDATE_CURRENT);

Update: 更新:

In my case i use service. 在我的情况下,我使用服务。

private fun activityPendingIntent(context: Context, action: String? = null): PendingIntent {
    Timber.d("activityPendingIntent")
    val intent = Intent(context, DummyBackgroundActivity::class.java)
    action?.let { intent.action = action }
    return PendingIntent.getActivity(context, ACTIVITY_NOTIFICATION_ID, intent, PendingIntent.FLAG_CANCEL_CURRENT)
}

DummyBackgroundActivity DummyBackgroundActivity

class DummyBackgroundActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val service = Intent(this, BackgroundService::class.java)
        service.action = intent.action
        startService(service)
    }

    override fun onResume() {
        super.onResume()
        finish()
    }
}

Service: 服务:

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    Timber.d("onStartCommand intent = %s", intent?.action)
    when (intent?.action) {
       //Handle it 
    }

    return Service.START_NOT_STICKY
}

I hope you replicate the same using Broadcast. 我希望你使用Broadcast复制相同的内容。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM