Android Fragments Android:通过Viewpager将Activity置于最前面的通知

fdbelqdn  于 2023-01-09  发布在  Android
关注(0)|答案(5)|浏览(224)

我的Android应用程序由一个Activity组成,其中包含两个通过选项卡访问的片段(我使用的是ViewPager)。
在Fragment #2中,通过一个按钮创建了一个通知,该按钮启动了一个后台任务,例如,如果用户使用home按钮将应用发送到后台,则需要继续执行该任务。
我希望用户能够在点击通知时将应用程序返回到最前面,就像使用应用程序图标一样。以下是我的代码:

  1. Notification.Builder mBuilder =
  2. new Notification.Builder(getActivity())
  3. .setSmallIcon(R.drawable.ic_stat_av_play)
  4. .setContentTitle("MyApp")
  5. .setContentText("A background task is running");
  6. Intent notificationIntent = new Intent(getActivity(), MainActivity.class);
  7. notificationIntent.setAction(Intent.ACTION_MAIN);
  8. notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
  9. PendingIntent notificationPendingIntent = PendingIntent.getActivity(
  10. getActivity(), 0, notificationIntent, 0);
  11. mBuilder.setContentIntent(notificationPendingIntent);
  12. mNotificationManager = (NotificationManager) getActivity().getSystemService(
  13. Context.NOTIFICATION_SERVICE);
  14. mNotificationManager.notify(1, mBuilder.build());

不幸的是,单击通知将关闭当前运行的应用程序并重新启动它。
如您所见,我尝试了此处提出的解决方案:Resume application and stack from notification,但它不起作用。许多类似的问题也建议使用以下一个或多个标志:

  1. FLAG_ACTIVITY_CLEAR_TOP
  2. FLAG_ACTIVITY_SINGLE_TOP
  3. FLAG_ACTIVITY_NEW_TASK
  4. FLAG_ACTIVITY_REORDER_TO_FRONT

我发现这些都对我的通知行为没有任何影响。我是否缺少了一些东西来使这个工作按预期进行?

    • 编辑:**

也许这会帮助你帮助我。问题似乎真的来自应用程序的结构。
如果我替换这一行:

  1. Intent notificationIntent = new Intent(getActivity(), MainActivity.class);

被这一个

  1. Intent notificationIntent = new Intent(getActivity(), Fragment2.class);

通知行为将是正确的,如果它被点击,而应用程序仍然在前台(即通知抽屉将简单地关闭自己)然而,如果我返回到主屏幕与主页按钮,然后点击通知,什么也没有发生。
如果我使用第一个Intent定义(带有MainActivity.class),则没有任何标志对Intent有任何影响。这也适用于清单中定义的launchMode。

    • 编辑2**

解决方案添加。我不太清楚为什么它是工作,所以任何额外的投入将不胜感激!

vptzau2j

vptzau2j1#

我用这个方法,问题解决了。希望这也能帮助你。

  1. Intent intent = new Intent(Intent.ACTION_MAIN);
  2. intent.addCategory(Intent.CATEGORY_LAUNCHER);
  3. intent.setClass(this, Main.class);
  4. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
wwwo4jvm

wwwo4jvm2#

你能试试这个吗,

  1. notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
  2. | Intent.FLAG_ACTIVITY_SINGLE_TOP
  3. | Intent.FLAG_ACTIVITY_NEW_TASK);

在你的旅客名单上,

  1. android:launchMode="singleTask"

用于您的主要活动。

mbzjlibv

mbzjlibv3#

所以,我终于设法使它工作!这里是最终的代码,我希望它能帮助其他人谁是在类似的情况。

  1. mBuilder =
  2. new Notification.Builder(getActivity())
  3. .setSmallIcon(R.drawable.ic_stat_av_play)
  4. .setContentTitle("MyApp")
  5. .setContentText("A background task is running.")
  6. .setOngoing(true);
  7. notificationIntent = new Intent(Intent.ACTION_MAIN);
  8. notificationIntent.setClass(getActivity().getApplicationContext(), MainActivity.class);
  9. notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
  10. notificationPendingIntent = PendingIntent.getActivity(getActivity(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
  11. mBuilder.setContentIntent(notificationPendingIntent);
  12. mNotificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
  13. mNotificationManager.notify(1, mBuilder.build());

我还必须在清单中设置这个launchMode:

  1. android:launchMode="singleTop"
展开查看全部
jc3wubiy

jc3wubiy4#

你可以试试,也许能帮到你!

  1. Intent intent = new Intent(Intent.ACTION_MAIN);
  2. intent.addCategory(Intent.CATEGORY_LAUNCHER);
  3. intent.setClass(this, Main.class);
  4. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
bpsygsoo

bpsygsoo5#

对我来说,唯一有效的方法是从PackageManger获取启动意图:

  1. import android.content.pm.PackageManager;
  2. import android.content.Context;
  3. import android.content.Intent;
  4. String packageName = mContext.getPackageName();
  5. PackageManager pm = mContext.getPackageManager();
  6. Intent launchIntent = pm.getLaunchIntentForPackage(packageName);
  7. return PendingIntent.getActivity(mContext, REQUEST_CODE, launchIntent,
  8. PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);

相关问题