确定从Application

时间:2017-12-09 20:17:09

标签: java android

我有一个简单的应用程序,在我做任何事情之前,我必须检查用户是否登录。 为此,我继承了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()。但这似乎很复杂。 我还能做什么?

这是AndroidManifest.xml

中的application标记

2 个答案:

答案 0 :(得分:1)

你的计划会引发问题。每次创建流程时,即使此特定流程不需要活动,也会启动活动。

显示启动器活动(例如响应用户点击主屏幕启动器图标)是一种方式,可以为您的应用创建流程。但还有很多其他人:

  • AlarmManager
  • JobScheduler
  • a Notification
  • 推送消息(例如,来自Firebase云消息传递)
  • 发送给您从应用导出的ContentProvider的请求
  • 发送给您从应用导出的Service的请求
  • 清单注册BroadcastReceiver
  • 用户在概览屏幕中返回您的任务

在这些场景中,没有一个显示此活动必然是合适的。但是,您的代码会在所有代码中显示活动,因为只要Android为您的应用分配流程,您就会显示此活动。

让您的所有活动(登录帐户除外)查看用户是否已登录,并在需要时将用户路由到登录活动。当用户完成登录并且登录活动结束时,用户将返回到他们尝试去的地方,无论是您的启动器活动还是其他一些活动(例如,他们在您的应用程序进入之后返回到您的任务有一段时间的背景,所以你的进程被终止了,但是Android会尝试将它们发送回你最后的任何活动。

答案 1 :(得分:0)

您可以简单地覆盖overviewActivity的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();
}