【问题标题】:Android using shared preference and Dispatcher activity, to get back to the last activity (after reboot the phone)Android 使用共享首选项和 Dispatcher 活动,返回上一个活动(重启手机后)
【发布时间】:2016-02-25 08:07:24
【问题描述】:

我正在使用共享首选项来保存我的应用程序的状态,以便能够在我的 Android 手机重新启动之前进入最后一个活动。我的目的是当 Android 系统管理内存并推出我的应用程序时,当用户重新进入应用程序时,他们将到达我的应用程序的最后一个 Activity 和屏幕。

这是我的一些代码:

首先是 DispatcherActivity.java :

> package com.lm.rosary;
> 
> import android.app.Activity; import android.content.Intent; import
> android.content.SharedPreferences; import android.os.Bundle;
> 
> 
> public class DispatcherActivity extends Activity {
> 
>       @Override
>       protected void onCreate(Bundle savedInstanceState) {
>           super.onCreate(savedInstanceState);
> 
>           Class<?> activityClass;
> 
>           try {
>               SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
>               activityClass = Class.forName(
>                   prefs.getString("lastActivity", Jfp1.class.getName()));
>           } catch(ClassNotFoundException ex) {
>               activityClass = Jfp1.class;
>           }
> 
>           startActivity(new Intent(this, activityClass));
>       }   }

第二个是我的示例活动 ( Jfp1.java ),我希望用户在手机重新启动或重新启动时返回此屏幕。 Jfp1.java:

> import android.content.SharedPreferences; import
> android.content.SharedPreferences.Editor;
> 
> 
> public class Jfp1 extends Activity implements OnClickListener { .... 
> 
> SharedPreferences prefs;
> SharedPreferences.Editor editor; 
> .... @Override    protected void onPause() {      super.onPause();
>       SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
>       Editor editor = prefs.edit();
>       editor.putString("lastActivity", getClass().getName());
>       editor.commit();    }

我的应用程序,从 MainActivity 到 Mysterytopray 和 Jfp1 类。 DispatcherActivity.java 在单独的类中。

和往常一样,我的第三个清单:

> <activity
>             android:name=".MainActivity"
>             android:label="@string/app_name" >
>             <intent-filter>
>                 <action android:name="android.intent.action.MAIN" />
> 
>                 <category android:name="android.intent.category.LAUNCHER" />
>             </intent-filter>
>         </activity>
>       
>         <activity
>             android:name="com.lm.rosary.DispatcherActivity"
>             android:label="@string/app_name" >
>             <intent-filter>
>                 <action android:name="android.intent.action.MAIN" />
>             </intent-filter>
>         </activity>
>         
>         <activity
>             android:name="com.lm.rosary.Jfp1"
>             android:label="@string/app_name"  >
>         </activity>

我在 Jfp1 屏幕上,我重新启动了 HP。但惠普重启后,我点击了我的应用程序图标,但 Jfp1 活动没有首先出现。首先出现的主要活动。但实际上,我希望它回到最后一个 Activity,即 Jfp1.java。

我对 Android 没有经验,所以请任何人给我一些建议并更正我的编码。非常感谢。

【问题讨论】:

  • 您的具体用例是什么?这可能会在将来导致更多问题,特别是如果您的 Dispatcher 跳转到屏幕,该屏幕可能是流程的一部分,并假设后台堆栈包含流程中的先前屏幕......并且如果您跳转到的活动从您的调度员开始确实是深度= 1,那么为什么要执行跳转呢? UX 应该为活动提供直接的路径……这些只是建议,了解您的确切用例会有所帮助。

标签: android android-activity sharedpreferences dispatcher android-reboot


【解决方案1】:

使用这个新代码

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
    </activity>

    <activity
        android:name="com.lm.rosary.DispatcherActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name="com.lm.rosary.Jfp1"
        android:label="@string/app_name"  >
    </activity>

更新: 调用finish()更合适,在下面添加这个

startActivity(new Intent(this, activityClass));
finish();

【讨论】:

  • 我已经按照您的建议进行了尝试,并且可以正常工作。 .但是发生了另一种情况,即:重新启动HP和Jfp1屏幕后,我按下HP上的“返回”按钮,它只显示空白屏幕。如何避免这种情况,所以我可以直接关闭应用程序而不会出现黑屏?非常感谢您的建议。
  • @LeonardMamangkey 这是因为 DispatcherActivity 是一个空白页面。添加意图标志 Intent.FLAG_ACTIVITY_NEW_TASK
  • 我应该把那个放在哪里?在清单上?还是在 DispatcherActivity.java 上?你能举个例子吗?非常感谢。
  • 看来你已经有了答案,使用finish()更简单。
  • 非常感谢,一切正常,您节省了我的时间。
【解决方案2】:

您的清单指定 MainActivity 是与应用程序一起打开的,因为它具有选项

<intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

如果您希望您的流程正常工作,则必须通过在其上设置这些选项,使 DispatcherActivity 成为您应用的唯一主要活动。

【讨论】:

  • 我按照你的建议试过了,没问题。 .但是发生了另一种情况,即:重新启动HP和Jfp1屏幕后,我按下HP上的“返回”按钮,它只显示空白屏幕。如何避免这种情况,所以我可以直接关闭应用程序而不会出现黑屏?非常感谢您的建议。
【解决方案3】:

MainActivity 是您的启动器,因此它会始终启动。

解决方案 - 在 MainActivity onCreate 中,如果是 Jfp1,则从 SharedPreference 读取数据,如果是其他活动,则打开 JFp1 屏幕,启动另一个活动,然后在主活动上调用 finish()。

【讨论】:

  • 我试过你的建议,成功了。非常感谢。
  • @LeonardMamangkey 你为什么取消标记我的答案。你说它有效?
  • 如果他们是 2 个或更多可以解决问题的答案....我只能放 1 个绿色正确标记。有没有办法获得 2 个或更多绿色正确标记?谢谢。
  • 我不知道如何获得 2 个或更多绿色正确标记。但是如果有多个正确答案,您应该将正确答案放在最先发布的答案中。
猜你喜欢
  • 2012-09-08
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 2011-06-16
  • 1970-01-01
相关资源
最近更新 更多