应用程序在后台打开时,保持活动/活动处于活动状态

时间:2015-07-02 07:06:30

标签: android android-activity timer background-service data-persistence

嘿伙计我是这个网站的新手,我知道人们因为提出重复的问题而被贬低了很多,所以我希望这不是其中之一。

除了这个网站,我是Android编程的新手,并且创建了一个简单的应用程序,用于根据时间计算价格。

这个应用程序有3个活动,我用来切换布局 1. FirstActivity - 显示标题页面和按钮以启动第二个活动 2. SecondActivity - 启动计时器并根据秒数计算价格。 3. LastActivity - 显示时间和价格的最终结果,并允许用户与其他应用程序(电子邮件,短信)共享此内容

一切都运行正常,但是当手机定位当前活动被杀死并重新启动时我通过强制布局画像来解决这个问题 - 当我将应用程序移动到后台时,我现在又遇到了这个问题< / p>

所以实际问题:即使用户切换应用,我也需要SecondActivity来保留时间,而LastActivity则保留已保存的信息。我不是谈论应用程序何时关闭我在谈论应用程序切换器或主页按钮何时被激活并且我的应用程序仍然在后台打开。

提前谢谢你!

4 个答案:

答案 0 :(得分:3)

所以最后我只需要更多关于如何实现每个人都建议的数据保存功能的信息,而且我已经找到了我需要的答案:How to make an android app return to the last open activity when relaunched?

解决问题 我需要补充一下: | 1 |一个新的Activity | 2 | <action><category>标记到活动| 3 |我需要保留的每个活动中都有SharedPreference个设置者。

  1. Per @ JosefPfleger的介绍我创建了一个名为RestorePrevActivity的新空白活动,并在android清单中将其设置为MAINLAUNCHER以及{{1}我还删除了第一次活动中的所有意图过滤器,因为它们是在第一次创建应用程序后默认的。

    DEFAULT
  2. 设置新活动的操作和类别后,我需要向活动添加代码。这已添加到<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>

  3. onCreate()

    `

    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)); } 如果找不到以前的活动,将替换为您将运行的默认活动。

    1. 最后,我完成了我的活动并添加了保存活动名称的FirstActivity
    2. 我将以下代码段添加到我的所有其他活动中,现在它的工作完美无缺。

      OnPause()

      @Override protected void onPause() { super.onPause(); SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putString("thisActivity", getClass().getName()); editor.commit(); } 更改为当前活动的名称。

      <强>结果 我能够启动我的应用程序,启动计时器,然后按下主页按钮或应用程序切换器,以安全地切换应用程序甚至锁定屏幕,并在返回时成功带回我的计时器,不间断运行!我把它放到了另一个测试并且发生了部落的冲突,一个记忆沉重的游戏,我也看了Youtube视频大约30我的应用程序在后台运行并回到我的应用程序,看到时间是正确的,并在我当时运行完美不见了。

      感谢大家的帮助! -Stephen

答案 1 :(得分:1)

当你的应用程序在停止方法调用的背景上进行,你可以做你想做的事情

    @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

答案 2 :(得分:1)

如果计时器有事可做,那听起来你需要一个service。但是,如果您只需要存储信息,则可以在每次调用onPause()时将它们存储在文件或数据库中。按onResume()

中的消失时间重新计算奖品

onPause()是有道理的,因为它被调用,那么你的应用就会失去焦点。

onResume(),因为每次您的应用再次获得焦点时都会调用它。

有关详细信息,请查看活动生命周期。

activity life cycle

来源:http://developer.android.com/reference/android/app/Activity.html

答案 3 :(得分:0)

您必须区分应用和活动。 该应用程序在后台停留的时间比活动长。如果您旋转设备,活动将恢复。

您需要按照android生命周期手册中的说明存储和恢复活动状态: http://developer.android.com/training/basics/activity-lifecycle/recreating.html

如果您需要执行定时后台任务,请查看TimerTask: http://developer.android.com/reference/java/util/TimerTask.html