【问题标题】:Starting another activity when one activity is about to start: Android当一个活动即将开始时开始另一个活动:Android
【发布时间】:2014-09-14 11:48:18
【问题描述】:

我有一个应用程序,每次用户访问该应用程序时,我都必须显示启动画面。那是他是否重新启动应用程序,或者他是否预先启动他的应用程序,或者他是否单击启动器图标。

问题是,在启动屏幕之后,我还想回到他离开应用程序时可见的最后一个活动(以防它不是新的开始)

为了解决这个问题,我扩展了应用程序并实现了 ActivityLifecycleCallbacks。

所以当我的应用程序处于免费状态并回到前台时,我会从

启动启动画面
@Override
    public void onActivityStarted(Activity activity) {
     //launch splash screen
}

现在,一旦启动画面工作完成,我就会将其杀死,然后我会回到用户最后一次使用应用程序时应用程序进入后台之前的任何活动。

这里似乎工作正常,但我不断收到以下错误:

09-14 16:44:46.746: E/ActivityThread(5622): Performing pause of activity that is not resumed: {SignInActivity}
09-14 16:44:46.746: E/ActivityThread(5622): java.lang.RuntimeException: Performing pause of activity that is not resumed: {SignInActivity}
09-14 16:44:46.746: E/ActivityThread(5622):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3015)
09-14 16:44:46.746: E/ActivityThread(5622):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3003)
09-14 16:44:46.746: E/ActivityThread(5622):     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2981)
09-14 16:44:46.746: E/ActivityThread(5622):     at android.app.ActivityThread.access$1000(ActivityThread.java:135)
09-14 16:44:46.746: E/ActivityThread(5622):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1207)
09-14 16:44:46.746: E/ActivityThread(5622):     at android.os.Handler.dispatchMessage(Handler.java:102)
09-14 16:44:46.746: E/ActivityThread(5622):     at android.os.Looper.loop(Looper.java:136)
09-14 16:44:46.746: E/ActivityThread(5622):     at android.app.ActivityThread.main(ActivityThread.java:5001)
09-14 16:44:46.746: E/ActivityThread(5622):     at java.lang.reflect.Method.invokeNative(Native Method)
09-14 16:44:46.746: E/ActivityThread(5622):     at java.lang.reflect.Method.invoke(Method.java:515)
09-14 16:44:46.746: E/ActivityThread(5622):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
09-14 16:44:46.746: E/ActivityThread(5622):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
09-14 16:44:46.746: E/ActivityThread(5622):     at dalvik.system.NativeStart.main(Native Method)

所以我有两个问题:

  1. 我该怎么做才能不出现此错误。
  2. 有没有更好的方法来处理我上面提到的流程:我必须显示启动屏幕,然后确保最后一个可见的活动?

谢谢, 晴天

【问题讨论】:

  • 发布您的相关代码。
  • 你是如何处理 SignInActivity 的?

标签: android android-activity activity-lifecycle


【解决方案1】:

进入 Oncreate 方法你可以启动一个ActivityForResult

startActivityForResult(intent, activity);

然后通过以下方式关注您的活动:

protected void onActivityResult(int requestCode, int resultCode, Intent data)

【讨论】:

  • 好的,告诉我新闻!
【解决方案2】:

如果我理解正确,即使应用程序已完全销毁/终止,您也希望显示最后一个活动。我认为您将需要持久数据来实现这一目标。我以下面的共享首选项为例(尚未对其进行测试,但希望您能理解)。

//Inside every activity of your app
@Override
public void onResume(){
    super.onResume();
    //Store the current activity name inside shared preferences
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("LastActivity", getCurrentActivityName());
    editor.commit();
    //Show splash screen here every time the app is brought to foreground (aka it resumes)
}

private void openActivityFromName(String name){
    Class<?> c = null;
    if(name != null) {
        try {
            c = Class.forName(name);
        } catch (ClassNotFoundException e) {            
            e.printStackTrace();
        }
    }
    Intent intent = new Intent(this, c);
    startActivity(intent);
}

private String getCurrentActivityName(){
    this.getClass().getSimpleName()
}

/**
* Inside your main activity (the one that opens first normally)
*/
@Override
protected void onCreate(Bundle state){
    super.onCreate(state);   
    // Restore preferences
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    String lastActivity = settings.getString("LastActivity", "");
    //Open the last opened activity everytime the app opens 
    openActivityFromName(lastActivity);
}

将您的应用程序置于后台(而不是关闭它)不会关闭您当前的活动。因此,只有在应用程序完全销毁并再次调用 onCreate 时才需要打开最后一个活动的行为。

【讨论】:

  • 感谢您的回复。如果有退出,我只想显示最后一个活动,否则我只是在显示初始屏幕后转到特定活动。但关键是我必须在显示上一个活动之前显示启动屏幕,因此我在上面粘贴了错误。
  • 还有一件事。如果我在调用前一个活动的 onResume 之后启动启动画面,那么它首先对用户可见,然后是启动画面,然后再次是前一个活动。我希望用户在启动屏幕完成之前看不到上一个活动
【解决方案3】:

我遇到了同样的问题。我认为您应该只使用 onResume 方法并最终使用 onPause() 方法来控制您的活动状态。

放置 onResume() 方法

@Override
protected void onResume()
{
 super.onResume();
...//
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多