如果App正在运行,请启动登录活动其他启动活动

时间:2014-12-18 19:30:06

标签: android android-activity

更新

我改变了@dunnololz在答案中指出的逻辑。但是现在即使应用程序正在运行,也会在点击启动器图标时出现Splash。 我希望第一次当应用程序没有运行时,会显示其他登录活动,但这不会发生。

这是我的代码:

清单启动启动器活动:

<activity
    android:name=".activities.Splash"
    android:label="@string/app_name"
    android:launchMode="singleInstance"
    android:noHistory="true"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

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

Splash.Java:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  startService(new Intent(Splash.this, IMService.class));

  setContentView(R.layout.activity_splash);

  Thread background = new Thread() {
    public void run() {

      try {
        // Thread will sleep for 3 seconds
        sleep(3 * 1000);

        Intent intent = new Intent(getBaseContext(), Login.class);
        // intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        startActivity(intent);

        finish();

      } catch (Exception e) {

      }
    }
  };

  // start thread
  background.start();
}

我正在使用this gist来确定应用是否正在运行。我是通过this tutorial找到的。因此,该类使用Application.ActivityLifecycleCallbacks作为API级别14+,这是我需要的。

我想做的是:

  • 如果应用程序在前台或后台运行,请启动登录活动
  • 如果应用程序未运行,请启动启动活动

这是我的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  Intent intent = new Intent(getBaseContext(), Splash.class);

  if (Foreground.get(this).isForeground()
      || Foreground.get(this).isBackground()) {

    intent = new Intent(EntryPoint.this, Login.class);
  }

  startActivity(intent);
  finish();
}

这是我的应用程序类:

public class MyApp extends Application {    

    @Override
    public void onCreate() {
        super.onCreate();

        Foreground.init(this);
    }

}

当然我也将我的应用程序添加到了清单文件中:

<application
    android:name=".MyApp"

问题Splash活动永远不会启动。它始终是Login活动。

我只是希望能够做到这一点:

  • 如果应用程序在前台或后台运行,请启动登录活动
  • 如果应用程序未运行,请启动启动活动

但不确定如何使这个工作,我可能会遗漏一些明显的东西。或者甚至可能是我对either in foreground or background的要求是错误的,因为我是Android新手。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

通常在Android中,不建议根据应用程序当前是否保留在内存中来确定行为。这就是操作系统应该关注的内容,而不是你想要关注的内容。

在当前版本的Android中(因为我不确定旧版本的这种行为是否属实),当您点击应用程序启动它时,操作系统会检查该应用程序是否已“打开”。如果是,它将恢复“打开”应用程序的状态。如果该应用尚未“开放”,Android将启动在启动器上标记的活动。因此,解决这个问题的方法就是让Android处理它。制作启动活动并将其标记为AndroidManifest.xml中的启动器。然后让启动器在一段时间后打开您的登录活动。

现在,如果应用已经打开,Android只会恢复上次打开的活动。否则它将显示发射器。