Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.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_Notifications_Android Intent_Back Button_Android Pendingintent - Fatal编程技术网

Android 通知打开活动,按下后退按钮,主活动是否打开?

Android 通知打开活动,按下后退按钮,主活动是否打开?,android,notifications,android-intent,back-button,android-pendingintent,Android,Notifications,Android Intent,Back Button,Android Pendingintent,我能描述我的问题的最好方式是: public void createNotification(int notifyId, int iconId, String contentTitle, String contentText) { Intent intent = new Intent(mContext, NewNoteActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExt

我能描述我的问题的最好方式是:

public void createNotification(int notifyId, int iconId, String contentTitle, String contentText) {
    Intent intent = new Intent(mContext, NewNoteActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra(AgendaNotesAdapter.KEY_ROW_ID, (long)notifyId);

    PendingIntent contentIntent = PendingIntent.getActivity(mContext, notifyId, intent, 0);

    Notification notification = new Notification(iconId, contentTitle, 0);
    notification.setLatestEventInfo(mContext, contentTitle, contentText, contentIntent);

    mNotificationManager.notify(notifyId, notification);
  • 启动时创建通知(使用
    广播接收器
  • “我的应用程序”主活动打开,按下“主页”按钮(在系统关闭之前,应用程序仍在后台运行)
  • 我拉下状态栏,按下先前在启动时创建的通知
  • 一些与主要活动不同的活动开始了
  • 我按下后退按钮,显示主要活动
  • 我怎样才能防止最后一步?我想用后退按钮回到我原来的位置,那就是主屏幕(桌面上有所有的小部件和应用程序图标)。我的应用程序的主要活动应该在后台运行,为什么用后退按钮调用它

    如果相关,我创建通知的代码如下所示:

    public void createNotification(int notifyId, int iconId, String contentTitle, String contentText) {
        Intent intent = new Intent(mContext, NewNoteActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(AgendaNotesAdapter.KEY_ROW_ID, (long)notifyId);
    
        PendingIntent contentIntent = PendingIntent.getActivity(mContext, notifyId, intent, 0);
    
        Notification notification = new Notification(iconId, contentTitle, 0);
        notification.setLatestEventInfo(mContext, contentTitle, contentText, contentIntent);
    
        mNotificationManager.notify(notifyId, notification);
    

    我试图在
    intent
    中添加更多的标志组合,但它们都没有解决我的问题。。。建议?

    我从您的问题中了解到,您的问题在以下步骤中

    1.启动完成后创建通知

    2.主要活动将要求启动

    3.您按下主页按钮,主要活动将停止,但不会破坏

    4.单击状态栏上的通知,您的
    应用程序将恢复
    ,这样您的后台堆栈中已经有了主要活动,通知将创建新活动,如您在问题中所述NewNoteActivity活动将被推到后台堆栈上。因此,在这一步
    中,您有两个活动在后台堆栈中堆栈

    5.您按下后退按钮后,
    最后一个活动将被销毁
    ,您的
    主要活动将恢复
    ,但您想进入主页屏幕

    因此,我从你的问题中了解到,你的问题在于以下步骤

    1.启动完成后创建通知

    2.主要活动将要求启动

    3.您按下主页按钮,主要活动将停止,但不会破坏

    4.单击状态栏上的通知,您的
    应用程序将恢复
    ,这样您的后台堆栈中已经有了主要活动,通知将创建新活动,如您在问题中所述NewNoteActivity活动将被推到后台堆栈上。因此,在这一步
    中,您有两个活动在后台堆栈中堆栈

    5.您按下后退按钮后,
    最后一个活动将被销毁
    ,您的
    主要活动将恢复
    ,但当您在NewNoteActivity活动中按下后退按钮时,您希望打开主页活动

    因此,解决方案是,当您在NewNoteActivityactivity中按下back按钮时,您可以使用
    意图再次启动主活动。FLAG\u activity\u CLEAR\u TOP
    标志,这样您的主活动将重新创建并接收
    onNewIntent()
    方法,这样您就可以获得标志并完成主活动

    例如

    @Override
        public void onBackPressed() {
            Intent i = new Intent(this, Main.class);
        i.putExtra("exit", true);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(i);
        super.onBackPressed();
        }
    
    现在,您必须在主要活动中实现
    onNewIntent()
    方法

    在NewNoteActivity活动中按下后退按钮时,您的主活动将调用
    onNewIntent()
    方法,因此在该方法中,您必须获取从NewNoteActivity活动传递的标志变量。如果您获取标志且该标志为真,则只需完成主活动即可进入主屏幕

    编辑

    你是说你有来自A,B的任何活动,或者打开C并按下后退按钮,此活动将被关闭。如果此时堆栈中只有一个活动,则应用程序将被关闭,这意味着您将进入主屏幕。但如果您有多个活动并按下后退按钮,则堆栈中至少有一个活动,现在单击通知,以便将打开与通知关联的新活动,以便将此活动推送到后堆栈上的活动上。现在,如果您按下“后退”按钮,则如果您尚未修改OnBackpress(),则与通知关联的最后一个活动将关闭方法,然后它将检查后堆栈中是否有任何活动,以便恢复活动,或者如果后堆栈中没有活动,则您的应用程序将关闭,您将看到主屏幕出现相同的问题。 对我有效的方法是在清单中为通知启动的活动设置以下属性:

    android:taskafinity=“”


    这从本质上分离了通知活动与主活动的关联性,因此操作系统不觉得需要“返回”到主活动,而只是返回到之前的任何活动,例如“桌面”。

    谁还需要答案。看起来这就是您想要实现的目标:

    从通知启动
    活动时,必须保留用户预期的导航体验。单击“上一步”应使用户通过应用程序的正常工作流程返回主屏幕,单击“最近”应将活动显示为单独的任务

    你的情况是-

    请参阅链接中的完整步骤。基本上你需要:
    1.在AndroidManifest.xml中定义
    活动
    层次结构

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".ResultActivity"
        android:parentActivityName=".MainActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity"/>
    </activity>
    

    它对我有用。试试这个:

    notifyIntent.setAction(Intent.ACTION\u MAIN);
    notifyIntent.addCategory(Intent.CATEGORY_启动器);
    
    我在应用程序中使用此解决方案。 覆盖onBackPressed(在从通知路由的活动中),并检查应用程序是否在堆栈中。如果没有,那么开始您的根活动。用户始终可以从根活动导航。这就是我在应用程序中所做的

    @Override
    public void onBackPressed() {
        if (isTaskRoot()) {
            Intent intent = new Intent(this,YourMainActivity.class);
            startActivity(intent);
            super.onBackPressed();
        }else {
            super.onBackPressed();
        }
    }
    

    差不多。。。问题是,我没有主页活动,你误解了我。我的意思是我想回到主屏幕,