当用户在我的通知中单击一个按钮时,我正试图打开main活动
,而该应用程序仅在后台运行并提供服务。单击按钮时,这些行在服务
类中被触发:
Intent openApp = new Intent(this, MainActivity.class);
openApp.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(openApp);
我已经检查过了,这些行被触发了,所以对按钮的点击做出反应没有问题,但是Activity
不会打开。
有什么建议吗?为什么这对我不起作用,我怎么能让它起作用?
我被要求提供更多的代码,因此在我的服务
中的
onStartCommand()
中,如果它在其意图
内以停止操作开始,我调用
killService()
方法,该方法会终止服务
,启动
main活动
,并执行其他一些操作:
if (action != null && action.equals(ACTION_STOP_SERVICE)) {
killService();
}
要设置
通知
s按钮,我使用以下代码:
Intent stopActionIntent = new Intent(this, TimerService.class);
stopActionIntent.setAction(ACTION_STOP_SERVICE);
PendingIntent stopActionPendingIntent = PendingIntent.getService(this, 1, stopActionIntent, PendingIntent.FLAG_IMMUTABLE);
timerNotificationBuilder.addAction(R.drawable.stop, "Stop", stopActionPendingIntent);
正如我所说,这个按钮已经对用户点击它做出了反应,所以这不是问题所在。
我找到了!看看这个答案
这个答案建议启用ScreeanOverlay
设置,因为从Android10及更高版本开始,你再也不能仅仅通过调用我使用的线路从后台打开活动
要使其工作,您必须通过清单添加此权限。xml
:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
然后用户必须在其他应用程序上启用显示设置
我搜索了一个选项,让用户更容易地使用这个设置,并找到了这个答案
这个答案给出了一个代码,可以将用户重定向到其他应用程序上的显示
设置
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 0);
}
然后我用通知的内容(文本)指导用户如何启用设置。
启用设置后,我在工作前使用的行。\
问题解决了吗?
上面描述的整个配置都可以工作,但前提是应用程序没有被杀死。
如果应用程序被杀死并且我尝试上面列出的方法,该应用程序将加入最近的应用程序列表,但不会打开并显示。
解决此问题的解决方案也将被接受为答案而不是此答案。
您可以尝试在广播接收器中接收单击,然后从那里打开活动。
尝试此操作可在通知中添加操作按钮:
timerNotificationBuilder.addAction(createNotificationActionButton("STOP");
其中,
createNotificationActionButton
方法如下:
public NotificationCompat.Action createNotificationActionButton(String text){
Intent intent = new Intent(this, StopwatchNotificationActionReceiver.class);
@SuppressLint("InlinedApi") PendingIntent pendingIntent = PendingIntent.getBroadcast(this, new Random().nextInt(100), intent, PendingIntent.FLAG_IMMUTABLE);
return new NotificationCompat.Action(0, text, pendingIntent);
}
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class StopwatchNotificationActionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
PrefUtil.setIsRunningInBackground(context, false);
PrefUtil.setTimerSecondsPassed(context, 0);
PrefUtil.setWasTimerRunning(context, false);
context.stopService(MainActivity.serviceIntent);
Intent activityIntent = new Intent(context, MainActivity.class);
activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActvity(activityIntent);
}
}
您还需要在清单中注册该接收器,如下所示:
<receiver android:name="StopwatchNotificationActionReceiver"/>
public static Intent serviceIntent;
并且此意图仅用于像这样启动服务:
//In onCreate
serviceIntent = new Intent(this, TimerService.class);
//In onPause
PrefUtil.setTimerSecondsPassed(this,seconds);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(serviceIntent);
}
或者你可以尝试一下简单的方法:
if (action != null && action.equals(ACTION_STOP_SERVICE)) {
Context context = this;
Intent activityIntent = new Intent(context, MainActivity.class);
activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActvity(activityIntent);
killService();
}
另一个解决方案是。再一次你需要参考我的回购协议,因为我已经对文件进行了更改,以便完成你的任务。在服务类中,参考此方法。在那里,如果动作被重置(r),我就开始活动。否则,它会打开广播接收器。然后,在活动中,我在
onResume()
方法中收到了额外的信息。如果未单击重置按钮,则会打开Receiver类。
和往常一样,你可以在这里查看应用程序的结果。
我希望代码能帮你完成工作。
点击通知按钮后如何关闭状态栏? 我试过了,但有个例外: 我的代码: 在NotificationIntent类
点击按钮时,Firebase Auth不会在上启动。 它仅在重新打开应用程序时有效。 出了什么问题?
我正在我的应用程序中实施谷歌云消息服务(GCM)。我使用gcmIntent服务创建了一个挂起的意图并打开了一个不是启动活动的活动。当应用程序打开时,它工作正常。但当应用程序关闭时,它会打开启动活动而不是所需的活动。我尝试了我能找到的所有解决方案,但都不起作用。我挣扎了一个多星期。任何帮助都将不胜感激。 我的代码 我得到下面的堆栈跟踪
我知道这个问题似乎重复,但为了我的要求,我已经在网上搜索了很多帖子,但没有一个对我有效。 我的要求 为此,我尝试了以下场景 情景1 使用将通知数据从传输到Launcher/Main活动,并根据bundle数据重定向到特定活动/片段 情景3 通过使用 按照上面的场景,当应用程序打开时,一切工作都很好,但如果我的应用程序关闭了,则意味着它总是重定向到main/launcher活动
我有一个带有通知的应用程序,如果我单击它们,就会打开某个活动。我想要的是,如果我点击通知,活动已经打开,它不是重新开始,但只是出现在前面。 我可以用标志来管理它吗?还是我应该在SharedPreferences中存储一个变量来检查它是否已打开? 谢谢!
我实际上正在处理需要推送通知的Xamarin Forms应用程序。我使用 Plugin.PushNotification 插件。 当应用程序在前台运行或处于睡眠状态(OnSap)时,当我单击收到的通知时,打开特定页面没有问题。但我想知道当应用程序关闭时如何做到这一点。谢谢!