为了账号安全,请及时绑定邮箱和手机立即绑定

通知恢复任务而不是特定活动?

通知恢复任务而不是特定活动?

手掌心 2019-11-14 15:30:49
我有一个前台服务,只要用户登录到应用程序,它就可以保持与服务器的连接打开。这样,即使用户通过按Home键将应用程序发送到后台,连接也可以保持活动状态并可以直接从服务器接收消息。该应用程序具有许多活动,当将其发送到后台时,其中任何一个都可能是活动的。我想允许用户单击通知以还原当前的活动。我知道如何还原特定的活动,但想知道是否有一种方法可以还原用户所在的上一个活动?当然,我可以跟踪最后一个,然后从Notification回调中调用它,但是认为在任务级别可能有办法吗?感谢您提供的任何建议。android android-activity
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

您需要的只是一个简单的活动,什么也不做。这是一个例子:


public class NotificationActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // Now finish, which will drop the user in to the activity that was at the top

        //  of the task stack

        finish();

    }

}

设置您的通知以开始此活动。确保清单中此活动的任务亲和力与应用程序中其他活动的任务亲和力相同(默认情况下,如果您未显式设置android:taskAffinity,则为)。


当用户选择此通知时,如果您的应用程序正在运行,则NotificationActivity将在应用程序任务中最顶层活动的顶部启动,并且该任务将被置于前台。当NotificationActivity完成时,它将简单地使用户返回到应用程序中最顶层的活动(即,当用户进入后台时将其停留在的任何位置)。


如果您的应用程序尚未运行,则此方法将无效。但是,您可以通过以下两种方法解决此问题:


当您的应用程序未运行时,请确保该通知未出现在通知栏中。


在NotificationActivity的onCreate()方法中,检查您的应用程序是否正在运行,以及是否未运行,请调用startActivity()并启动您的应用程序。如果这样做,请确保在启动应用程序时设置标志Intent.FLAG_ACTIVITY_NEW_TASK,以便该任务的根活动不是NotificationActivity。


查看完整回答
反对 回复 2019-11-14
?
PIPIONE

TA贡献1829条经验 获得超9个赞

效果很好,谢谢大卫!以下类检查应用程序是否已在运行,如果尚未运行,则在完成之前启动它(如David在选项2中所建议的)。


public class NotificationActivity extends Activity 

{

    @Override

    protected void onCreate(Bundle savedInstanceState) 

    {

        super.onCreate(savedInstanceState);


        // If this activity is the root activity of the task, the app is not running

        if (isTaskRoot())

        {

            // Start the app before finishing

            Intent startAppIntent = new Intent(getApplicationContext(), MainActivity.class);

            startAppIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            startActivity(startAppIntent);

        }


        finish();

    }

}


查看完整回答
反对 回复 2019-11-14
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

Intent intent = new Intent(Intent.ACTION_MAIN);

intent.addCategory(Intent.CATEGORY_LAUNCHER);

毫无疑问,这可行,但是问题是当您将意图设置为ACTION_MAIN时。这样,您将无法将任何捆绑软件设置为该意图。我的意思是,由于ACTION_MAIN不能包含任何额外的数据,因此不会从目标活动中接收您的原始数据。


取而代之的是,您可以将活动设置为singleTask并正常调用意图,而无需设置ACTION_MAIN并从目标活动的onNewIntent()方法接收意图。


但是请注意,如果您调用super.onNewIntent(intent); 然后将创建该活动的第二个实例。只是不要调用超级方法。


查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 421 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信