0

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

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

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

一切正常,但是当手机定向当前活动时被杀死并重新启动我已经通过强制布局为纵向来解决这个问题 - 当我将应用程序移动到后台时,我现在又遇到了这个问题

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

先感谢您!

4

4 回答 4

3

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

为了解决 我需要添加的问题:|1| 一个新的Activity |2| <action><category>活动标签 |3| SharedPreference我需要保留的每项活动中的二传手。

  1. 根据@JosefPfleger 的说明,我创建了一个名为的新空白活动,并RestorePrevActivity在 android 清单中将其设置为MAINand我还删除了我的第一个活动中的所有意图过滤器,因为它们在第一次创建应用程序后默认存在。LAUNCHERDEFAULT

    <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();
}

wherethisActivity更改为当前活动的名称。

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

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

于 2015-07-03T10:48:52.573 回答
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

于 2015-07-02T07:20:09.377 回答
1

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

onPause()有道理,因为它被调用然后你的应用程序失去焦点。

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

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

活动生命周期

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

于 2015-07-02T07:21:11.613 回答
0

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

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

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

于 2015-07-02T07:18:23.623 回答