当前位置:  开发笔记 > Android > 正文

如何恢复Android应用程序而不会丢失具有深层链接的活动堆栈(或应用程序状态)?

如何解决《如何恢复Android应用程序而不会丢失具有深层链接的活动堆栈(或应用程序状态)?》经验,为你挑选了1个好方法。

我有这个,每次按下某个链接它打开我的应用程序但问题是它打开我的应用程序的实例.反正有没有触发onResume()并只是恢复我的应用程序而不会丢失其状态或活动堆栈?

这是意图过滤器:

        
            
            
            
            

            

            
            
        
更新

感谢用户David Wasser在下面回答我找到答案:

所以我创建了在gmail/inbox应用程序之上启动的EntryActivity:

public class EntryActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.entry_activity);

        Uri uriParams = getIntent().getData();

        Log.e("EntryActivity", uriParams.getHost() );
        Log.e("EntryActivity", uriParams.getQueryParameter("uid") + " " + uriParams.getQueryParameter("type") + " " + uriParams.getQueryParameter("token") );


        Intent startCategory = new Intent(this, GotEmailActivity.class);
        startCategory.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(startCategory);
        this.finish();
    }

}

然后当我的应用程序在GotEmailActivity打开时,我向用户发送电子邮件,其中包含打开应用程序的链接,而GotEmailActivity android:launchMode="singleTop"在AndroidManifest中具有属性,因此只打开了1个实例:

    
    

现在发生的事情是,EntryActivity在Gmail应用程序的顶部打开但它关闭了inmediatle但首先启动已经打开的GotEmailActivity,因此属性launchMode Singletop会阻止此类活动的新实例.



1> David Wasser..:

您应该创建另一个Activity用作响应时应用程序的入口点.像这样的东西:

你需要的只是一个什么都不做的简单活动.这是一个例子:

public class EntryActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Check to see if this Activity is the root activity
        if (isTaskRoot()) {
            // This Activity is the only Activity, so
            //  the app wasn't running. So start the app from the
            //  beginning (redirect to MainActivity)
            Intent mainIntent = getIntent(); // Copy the Intent used to launch me
            // Launch the real root Activity (launch Intent)
            mainIntent.setClass(this, MainActivity.class);
            // I'm done now, so finish()
            startActivity(mainIntent);
            finish();
        } else {
            // App was already running, so just finish, which will drop the user
            //  in to the activity that was at the top of the task stack
            finish();
        }
    }
}

把你的活动,而不是你的"发射器"活动.确保在清单中,此活动的任务关联性与应用程序中其他活动的任务关联性相同(默认情况下,如果您未明确设置android:taskAffinity).

被触发,如果你的应用程序正在运行,那么EntryActivity将开始在上面的应用程序的任务,最上面的活动和任务将被带到前台.当EntryActivity完成后,它会简单地返回用户最上面的活动在您的应用程序(即:无论用户在哪里离开它,当它走进背景).

如果您的应用程序没有运行,EntryActivity则会识别此并从头开始启动您的应用程序,并将其传递Intent包含触发该操作的ACTION和DATA .

应该管用.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有