【问题标题】:How to restore content in the same Activity based on the calling Intent?如何根据调用 Intent 恢复同一个 Activity 中的内容?
【发布时间】:2010-05-18 15:04:34
【问题描述】:

这是我的场景:我通过 AppWidget 启动 Activity A。 AppWidget 显示(除其他外)3 个按钮。他们每个人都有自己的意图。它们旨在通过名为 AppWidgetReceiver 的类向 Activity 提供信息。在后者中,我创建了这样的意图:

Intent i = new Intent(context, CreateNoteActivity.class);  
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
i.putExtra(AppWidget.WIDGET_ITS_TRIGGER_ID, trigger_id);  
i.putExtra(AppWidget.WIDGET_TITLE, title);  
i.putExtra(AppWidget.WIDGET_DESCRIPTION, descr);  
context.startActivity(i);

这将启动 Activity A。基于trigger_idtitledescr,我为用户创建了某种信息菜单:

coreQuestionTitle   = getIntent().getStringExtra(AppWidget.WIDGET_TITLE);  
coreQuestionDescr   = getIntent().getStringExtra(AppWidget.WIDGET_DESCRIPTION);  
coreQuestionId      = getIntent().getIntExtra(AppWidget.WIDGET_ITS_TRIGGER_ID, -1); 
TextView tvCoreQuestion = (TextView) findViewById(R.id.create_note_core_question_text);
tvCoreQuestion.setText(coreQuestionTitle);

所有这些都可以正常工作。当我不通过this.finish()“关闭”活动时,就会出现问题,例如按下主页或返回按钮。当我现在单击 AppWidget 上的 OTHER 按钮时,先前打开的 Activity 将恢复而不是重新启动。 onCreate() 未被调用。相反,它直接跳转到onStart()。我知道这是 Activity 生命周期的意图,因为任务仍然存在。
不幸的是,我确实需要能够检索意图中指定的参数来设置所需的信息。此外,我希望能够恢复任何 3 个不同任务的状态。谁能帮我解决这个问题?

顺便说一句:我通过使用 android:configChanges="keyboardHidden|orientation" 和 onConfigurationChanged() 来避免传递 onCreate()。 Manifest.xml 中 Activity 的声明如下:

<activity android:name=".notes.CreateNoteActivity"  
    android:configChanges="keyboardHidden|orientation"  
    android:label="@string/create_note"  
    android:launchMode="singleTask"  
    android:theme="@android:style/Theme.NoTitleBar" >  
    <intent-filter>  
        <category android:name="android.intent.category.CATEGORY_HOME" />  
    </intent-filter>  
</activity>

提前致谢,
斯特夫

【问题讨论】:

    标签: android android-activity android-intent restore


    【解决方案1】:

    在您的onStop()onPause() 方法上专门杀死活动(通过调用this.finish())怎么样?当用户点击小部件的不同按钮时,这可能会产生额外的开销,但这是您可以强制每次点击调用 onCreate() 的唯一方法。

    【讨论】:

    • 我一直在考虑这个问题。对于如何为每种不同类型的“条目”(即 AppWidget 按钮)保存数据有什么建议?创建一个专用的 SQLite 表?
    • 坚持使用 SQLite 可能比重新创建活动更糟糕,因为那时您正在执行 I/O。想想用例,如果您的用户不会来回做很多来点击不同的按钮,那么重新创建类听起来不错。此外,如果您保持活动类很小(不是很多视图或对象),重新创建它也不会那么糟糕。另一方面,我也会查看 Preferences 文件,它的开销比 SQLite 少得多,并且非常适合保存简单数据:developer.android.com/guide/topics/data/data-storage.html#pref
    • 因为我只会在数据库中存储很少的项目,所以我决定使用它。性能在我的应用程序中并不(真正)关键,所以这对我来说很好。感谢您的帮助
    • 现在还有一件事。几乎一切都按预期工作。如果按下主页按钮,唯一的问题仍然存在。我没有机会拦截它的行为。那么如果按下主页按钮,我该如何调用 this.finish() 呢?
    • 当这种情况发生时,我相信 android 会在你的活动上调用 onPause() 或 onStop(),所以只需覆盖它们并在其中调用 finish()。
    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2018-06-14
    • 2016-05-31
    相关资源
    最近更新 更多