当应用程序在后台打开时,让 activity/activities 保持活动状态
Keep an activity/activities alive while the app is open in the background
大家好,我是这个网站的新手,我知道很多人会因为提出重复的问题而被贬低,所以我希望这不是其中之一。
除了这个网站,我还是 android 编程的新手,并且 创建了一个简单的应用程序来根据时间计算价格。
这个应用程序有 3 个我用来切换布局的活动
1. FirstActivity
- 显示标题页和启动第二个的按钮 activity
2. SecondActivity
- 启动计时器并根据秒数计算价格。
3. LastActivity
- 显示时间和价格的最终结果,并允许用户与其他应用程序(电子邮件、短信)共享此结果
一切正常,但是当 phone 定位当前 activity 被杀死并重新启动时,我通过强制布局为纵向来解决这个问题 - 我现在 运行 当我将应用程序移到后台时再次遇到这个问题
所以实际问题:我需要我的 SecondActivity
来保持时间,我的 LastActivity
来保持保存的信息,即使用户切换应用程序也是如此。 我说的不是应用程序何时关闭,而是应用程序切换器或主页按钮何时被激活而我的应用程序仍在后台打开。
提前致谢!
您必须区分应用程序和 activity。
该应用程序在后台停留的时间比 activity 更长。如果旋转设备,activity 会恢复。
您需要按照 android 生命周期手册中的描述存储和恢复 activity 的状态:
http://developer.android.com/training/basics/activity-lifecycle/recreating.html
如果您需要执行定时后台任务,请查看 TimerTask:
http://developer.android.com/reference/java/util/TimerTask.html
当您的应用在停止方法调用时进入后台并且您可以做您想做的事
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
// you can store you values here!
SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(Activity_Name.this);
getPrefs.edit().putBoolean("running", true).commit();
getPrefs.edit().putString("name", "save this string").commit();
// to retrieve values anywhere in your application
boolean a = getPrefs.getBoolean("running", true);
String str = getPrefs.getString("name", "");
}
你可以详细看看这个
http://developer.android.com/training/basics/activity-lifecycle/recreating.html
听起来你需要 service
如果计时器有事可做。但是,如果您只需要存储信息,则可以在每次调用 onPause()
时将它们存储在文件或数据库中。按onResume()
中的已用时间重新计算奖品
onPause()
是有道理的,因为调用它之后您的应用程序就会失去焦点。
onResume()
因为每次您的应用再次获得焦点时都会调用它。
有关更多信息,请查看 activity 生命周期。
来源:http://developer.android.com/reference/android/app/Activity.html
所以最后我只需要更多关于如何实现每个人都建议并且 android 拥有的数据保存功能的信息,我在这里找到了我需要的答案:How to make an android app return to the last open activity when relaunched?
解决问题
我需要添加:
|1|一个新的 Activity
|2| <action>
和 <category>
标签到 activity |3|每个 activity 我需要保留 SharedPreference
个二传手。
根据@JosefPfleger 的指示,我创建了一个名为 RestorePrevActivity
的新空白 activity,并在 android 清单中将其设置为 MAIN
和 LAUNCHER
和 DEFAULT
我还删除了我的第一个 activity 中的所有意图过滤器,因为它们是在第一次创建应用程序后默认设置的。
<activity
android:name=".FirstActivity"
android:label="@string/app_name"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".SecondActivity"
android:label="@string/title_activity_second"
android:screenOrientation="portrait"
android:launchMode="standard">
</activity>
<activity
android:name=".LastActivity"
android:label="@string/title_activity_last"
android:screenOrientation="portrait"
android:launchMode="standard">
</activity>
<activity
android:name=".RestorePrevActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
设置新 activity 的操作和类别后,我需要向 activity 添加代码。这是添加到 onCreate()
of RecoverPrevActivity
`
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Class<?> activityClass;
try {
SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
activityClass = Class.forName(
prefs.getString("lastActivity", FareActivity.class.getName()));
} catch(ClassNotFoundException ex) {
activityClass = FareActivity.class;
}
startActivity(new Intent(this, activityClass));
}
其中 FirstActivity
将替换为默认值 activity 如果找不到之前的 activity,您将 运行。
- 最后我完成了我的活动并添加了一个
OnPause()
保存了 activity 名称。
我将以下代码段添加到我的所有其他活动中,现在它可以正常工作了。
@Override
protected void onPause() {
super.onPause();
SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("thisActivity", getClass().getName());
editor.commit();
}
其中thisActivity
改为现在activity的名字。
结果
我能够启动我的应用程序,启动计时器,然后按主页按钮或应用程序切换器以安全地切换应用程序甚至锁定屏幕,并且 return 它成功地恢复了我的计时器 运行ning不间断!我对它进行了另一项测试 运行 clash of clans,这是一款记忆力很强的游戏,我还在后台使用我的应用程序 运行ning 观看了约 30 个 Youtube 视频,然后返回我的应用程序查看时间是正确的,运行 完美,而我不在。
感谢大家的帮助!
-斯蒂芬
大家好,我是这个网站的新手,我知道很多人会因为提出重复的问题而被贬低,所以我希望这不是其中之一。
除了这个网站,我还是 android 编程的新手,并且 创建了一个简单的应用程序来根据时间计算价格。
这个应用程序有 3 个我用来切换布局的活动
1. FirstActivity
- 显示标题页和启动第二个的按钮 activity
2. SecondActivity
- 启动计时器并根据秒数计算价格。
3. LastActivity
- 显示时间和价格的最终结果,并允许用户与其他应用程序(电子邮件、短信)共享此结果
一切正常,但是当 phone 定位当前 activity 被杀死并重新启动时,我通过强制布局为纵向来解决这个问题 - 我现在 运行 当我将应用程序移到后台时再次遇到这个问题
所以实际问题:我需要我的 SecondActivity
来保持时间,我的 LastActivity
来保持保存的信息,即使用户切换应用程序也是如此。 我说的不是应用程序何时关闭,而是应用程序切换器或主页按钮何时被激活而我的应用程序仍在后台打开。
提前致谢!
您必须区分应用程序和 activity。 该应用程序在后台停留的时间比 activity 更长。如果旋转设备,activity 会恢复。
您需要按照 android 生命周期手册中的描述存储和恢复 activity 的状态: http://developer.android.com/training/basics/activity-lifecycle/recreating.html
如果您需要执行定时后台任务,请查看 TimerTask: http://developer.android.com/reference/java/util/TimerTask.html
当您的应用在停止方法调用时进入后台并且您可以做您想做的事
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
// you can store you values here!
SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(Activity_Name.this);
getPrefs.edit().putBoolean("running", true).commit();
getPrefs.edit().putString("name", "save this string").commit();
// to retrieve values anywhere in your application
boolean a = getPrefs.getBoolean("running", true);
String str = getPrefs.getString("name", "");
}
你可以详细看看这个
http://developer.android.com/training/basics/activity-lifecycle/recreating.html
听起来你需要 service
如果计时器有事可做。但是,如果您只需要存储信息,则可以在每次调用 onPause()
时将它们存储在文件或数据库中。按onResume()
onPause()
是有道理的,因为调用它之后您的应用程序就会失去焦点。
onResume()
因为每次您的应用再次获得焦点时都会调用它。
有关更多信息,请查看 activity 生命周期。
来源:http://developer.android.com/reference/android/app/Activity.html
所以最后我只需要更多关于如何实现每个人都建议并且 android 拥有的数据保存功能的信息,我在这里找到了我需要的答案:How to make an android app return to the last open activity when relaunched?
解决问题
我需要添加:
|1|一个新的 Activity
|2| <action>
和 <category>
标签到 activity |3|每个 activity 我需要保留 SharedPreference
个二传手。
根据@JosefPfleger 的指示,我创建了一个名为
RestorePrevActivity
的新空白 activity,并在 android 清单中将其设置为MAIN
和LAUNCHER
和DEFAULT
我还删除了我的第一个 activity 中的所有意图过滤器,因为它们是在第一次创建应用程序后默认设置的。<activity android:name=".FirstActivity" android:label="@string/app_name" android:screenOrientation="portrait" > </activity> <activity android:name=".SecondActivity" android:label="@string/title_activity_second" android:screenOrientation="portrait" android:launchMode="standard"> </activity> <activity android:name=".LastActivity" android:label="@string/title_activity_last" android:screenOrientation="portrait" android:launchMode="standard"> </activity> <activity android:name=".RestorePrevActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
设置新 activity 的操作和类别后,我需要向 activity 添加代码。这是添加到
onCreate()
ofRecoverPrevActivity
`
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Class<?> activityClass;
try {
SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
activityClass = Class.forName(
prefs.getString("lastActivity", FareActivity.class.getName()));
} catch(ClassNotFoundException ex) {
activityClass = FareActivity.class;
}
startActivity(new Intent(this, activityClass));
}
其中 FirstActivity
将替换为默认值 activity 如果找不到之前的 activity,您将 运行。
- 最后我完成了我的活动并添加了一个
OnPause()
保存了 activity 名称。
我将以下代码段添加到我的所有其他活动中,现在它可以正常工作了。
@Override
protected void onPause() {
super.onPause();
SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("thisActivity", getClass().getName());
editor.commit();
}
其中thisActivity
改为现在activity的名字。
结果 我能够启动我的应用程序,启动计时器,然后按主页按钮或应用程序切换器以安全地切换应用程序甚至锁定屏幕,并且 return 它成功地恢复了我的计时器 运行ning不间断!我对它进行了另一项测试 运行 clash of clans,这是一款记忆力很强的游戏,我还在后台使用我的应用程序 运行ning 观看了约 30 个 Youtube 视频,然后返回我的应用程序查看时间是正确的,运行 完美,而我不在。
感谢大家的帮助! -斯蒂芬