【问题标题】:Keep an activity/activities alive while the app is open in the background当应用程序在后台打开时保持活动/活动活跃
【发布时间】:2015-07-02 07:06:29
【问题描述】:

大家好,我是这个网站的新手,我知道人们会因为提出重复的问题而感到沮丧,所以我希望这不是其中之一。

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

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

一切正常,但是当手机定向当前活动时,当前活动被终止并重新启动,我已通过强制布局为纵向来解决此问题 - 当我将应用程序移至后台时,我现在再次遇到此问题

所以实际的问题:我需要我的SecondActivity 来保持时间,我的LastActivity 来保持保存的信息,即使用户切换应用也是如此。我不是在谈论什么时候当应用切换器或主页按钮被激活并且我的应用仍在后台打开时,我正在谈论应用关闭。

提前致谢!

【问题讨论】:

  • 你完全想这样做..如果 bcoz 应用程序长时间处于后台或内存不足时,它应该从列表中删除
  • 不清楚...详细说明

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


【解决方案1】:

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

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

  1. 根据@JosefPfleger 的指示,我创建了一个名为RestorePrevActivity 的新空白活动,并在android 清单中将其设置为MAINLAUNCHERDEFAULT 我还删除了我的第一个活动中的所有意图过滤器第一次创建应用后默认在那里。

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

如果找不到以前的活动,FirstActivity 将被替换为您将运行的默认活动。

  1. 最后我浏览了我的活动并添加了一个 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();
}

其中thisActivity 更改为当前活动的名称。

结果 我能够启动我的应用程序,启动计时器,然后按主页按钮或应用程序切换器以安全地切换应用程序甚至锁定屏幕,并在返回时成功恢复我的计时器,它正在不间断地运行!我对其进行了另一次测试并运行了部落冲突,这是一款记忆力很强的游戏,我还在后台运行我的应用程序的情况下观看了大约 30 段的 Youtube 视频,然后回到我的应用程序查看时间是否正确并且在我运行时运行完美走了。

感谢大家的帮助! -斯蒂芬

【讨论】:

    【解决方案2】:

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

    onPause() 有意义,因为它被调用然后你的应用失去焦点。

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

    有关更多信息,请查看活动生命周期。

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

    【讨论】:

    • android 文档解释说,只有当用户从 onPause() 返回到应用程序时才会调用 onResume();在完整的应用程序切换、主页按钮或返回按钮的情况下,onPause() 将改为运行 onStop() 并销毁我的活动。
    • @StephenMiller 看看我在编辑中添加的图片,它会调用onStop(),但也会调用onPause()
    • 嘿,我尝试了保存实例状态和偏好方法,但没有成功,它们会在停止或暂停时被删除,所以我的下一步行动是像你建议的那样研究读/写能力。这样我就可以保存开始时间并计算从那以后经过的时间,谢谢! (如果可以的话,ps 会支持所有人,但我仍然只有 lvl 1 或其他任何含义)
    【解决方案3】:

    当您的应用程序在 stop 方法调用上进入后台时,您可以做任何您想做的事情

        @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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多