确定从应用程序子类开始的活动



我有一个简单的应用程序,在我做任何事情之前,我必须检查用户是否已登录。为此,我继承了Application类:

public class GBApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        if (userIsLoggedIn()) {
            Intent overviewActivity = new Intent(this, Overview.class);
            overviewActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(overviewActivity);
        }
    }    
}

userIsLoggedIn()返回存储在SharedPreferences文件中的布尔。

一切都起作用,但是当我从Overview活动中向后退时,它会将我重定向到默认活动(MainActivity),并将其从AndroidManifest.xml文件中删除,给出了错误。另外,我无法称呼finish(),因为这是一个非活动类。

Overview类返回后,如何终止程序?我找到了将其传递给MainActivity的解决方案,从那里调用finish()。但这似乎很复杂。我还能做什么?

这是我的 application标签 AndroidManifest.xml

您的计划将引起问题。每次创建过程时,即使在此特定过程中不需要活动也不需要活动。

也是如此。

显示启动器活动—例如,为了响应用户在主屏幕启动器图标上敲击—是一种的方式,可以为您的应用创建一个过程。但是还有很多:

  • AlarmManager
  • JobScheduler
  • Notification
  • 推送消息(例如,来自Firebase Cloud Messaging)
  • 发送给您从应用程序导出的ContentProvider的请求
  • 发送给您从应用程序导出的Service的请求
  • 明显注册的BroadcastReceiver
  • 用户在概述屏幕中返回您的任务
  • 等等

在这些情况下,任何一个都不必然显示此活动。但是,您的代码将在所有活动中显示活动,因为任何时候Android forks都会为您的应用程序提供一个过程,您都会显示此活动。

拥有您的所有活动(除登录名外)查看用户是否已登录,如果需要的话,将用户路由到登录活动。当用户完成登录并完成登录活动时,用户将返回到试图去的位置,无论是您的启动器活动还是其他活动(例如,在您的应用程序中,他们返回您的任务背景一段时间,因此您的过程被终止,但是Android试图将它们发送回您最后一次的活动)。

您可以简单地覆盖概述性的onbackpressed(),并驾驶时,当按下返回按钮时,应用程序的方向(在您的情况下都要关闭应用程序):

@Override
   public void onBackPressed(){
      startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
}

上面的代码立即关闭您的应用程序,单击后返回按钮(这很无聊..但很简单)。您也可以在下面尝试代码段;它弹出一个对话框:

    @Override
   public void onBackPressed(){
        new AlertDialog.Builder(this)
                    .setMessage("Are you sure you want to exit?")
                    .setCancelable(false)
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener(){
                        public void onClick(DialogInterface dialog, int id){
                            startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
                        }
                    })
                    .setNegativeButton("No", null)
                    .show();
}

最新更新