java - 始终返回登录屏幕

标签 java android android-manifest

我有一个应用程序通过 Splash activity screen 启动 5 秒然后打开 Login activity screen 然后在输入正确的用户和密码后打开 Menu activity ( listActivity) 然后每行点击打开 MyCity activity

更新:

我想要得到的是:无论您在我的应用程序中的哪个位置,并且出于任何原因离开我的应用程序不仅是在您按下主页按钮时 strong> 还举个例子:

  1. 您按主页按钮查看另一个应用,然后想返回到我的应用。

  2. 您在 whatsup 或电子邮件上收到显示新消息的通知,您打开 whatsup 或打开电子邮件,然后返回到我的应用。

3- 您离开手机一段时间后想再次查看我的应用。

4- 您按电源按钮关闭手机(锁定屏幕),然后打开锁并想返回我的应用程序。

我的意思是任何时候你出于任何原因离开我的应用程序但没有按 back back back back 按钮将退出整个应用程序 然后想再次返回我的应用程序必须打开 您登录屏幕再次输入您的用户名和密码。

我为 Splash Activity 和登录 Activity 调用了 finish();

我在 list 的登录 Activity 中尝试了:android:clearTaskOnLaunch="true",但没有成功。

任何建议将不胜感激,

请编写完整的工作代码。

登录 Activity :

 public class Login extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);

    Button b = (Button) findViewById(R.id.loginbutton);

  b.setOnClickListener(new OnClickListener() {

  public void onClick(View v) {

    EditText username = (EditText) findViewById(R.id.login);
    EditText password = (EditText) findViewById(R.id.password);

     if(username.getText().toString().length() > 0 && password.getText().
             toString().length() > 0 ) {
if(username.getText().toString().equals("test") && password.getText().
             toString().equals("test")) {


    Intent intent = new Intent(Login.this, Menu.class);
    startActivity(intent);
       finish(); }
            }   }               
                    });  }  }

菜单 Activity :

  public class Menu extends ListActivity {

      String classes[] = { "City1", "City2", "City3", "City4", "City5"};

          @Override
      protected void onCreate(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         super.onCreate(savedInstanceState);

      setListAdapter(new ArrayAdapter<String>(Menu.this,
        android.R.layout.simple_list_item_1, classes));
                                   }

     @Override
       protected void onListItemClick(ListView l, View v, int position, long id) {
         // TODO Auto-generated method stub
          super.onListItemClick(l, v, position, id);
         String cheese = classes[position];
   try {
    Class ourClass = Class.forName("com.test.demo.MyCity");
    Intent ourIntent = new Intent(Menu.this, ourClass);
    ourIntent.putExtra("cheese", cheese);
         startActivity(ourIntent);
           } catch (ClassNotFoundException e) {
        e.printStackTrace();
                            }
                    }}

我的城市 Activity :

   public class MyCity extends Activity {
TextView tv1;
String city;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.city);  

    initializeTextViews();}

private void initializeTextViews() {

    tv1=(TextView)findViewById(R.id.city_tv);
     city=getIntent().getStringExtra("cheese");

if(city.equalsIgnoreCase("City1")){

        tv1.setText(Html.fromHtml(getString(R.string.city1)));}


    else if(city.equalsIgnoreCase("City2")){

        tv1.setText(Html.fromHtml(getString(R.string.city2)));}


    else if(city.equalsIgnoreCase("City3")){

        tv1.setText(Html.fromHtml(getString(R.string.city3)));}


    else if(city.equalsIgnoreCase("City4")){

        tv1.setText(Html.fromHtml(getString(R.string.city4)));}


    else if(city.equalsIgnoreCase("City5")){

        tv1.setText(Html.fromHtml(getString(R.string.city5)));}


    }}

我的 list :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.demo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity
            android:name=".Splash"
            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=".Login"
            android:label="@string/app_name" 
                 android:clearTaskOnLaunch="true">
            <intent-filter>
                <action android:name="com.test.demo.LOGIN" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

        <activity
            android:name=".Menu"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="com.test.demo.MENU" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

              <activity
            android:name=".MyCity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="com.test.demo.MYCITY" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

第二次更新:我达到了我想要的一半,但仍有一些步骤我无法实现,解释如下:

通过将 android:clearTaskOnLaunch="true" 应用于 Splash Activity ,

并防止菜单 Activity 上的后退按钮行为:

  @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
       moveTaskToBack(true);
       return true;
            }
    return super.onKeyDown(keyCode, event);
                    } }

现在当按下主页按钮离开我的应用程序然后返回到我的应用程序时:

直接转到登录 Activity

但现在的主要目标是:

如果:

屏幕锁定当您离开手机时,或轻按电源按钮锁定手机。

OPENED MESSAGE 来自通知

OPENED EMAIL 来自通知

你有CALL并接听,

然后返回到我的应用它不会进入登录 Activity 但您将返回到您之前所在的页面。

任何建议,谢谢。

THIED 更新:

我使用另一个代码来覆盖主页按钮并控制后退按钮而不是应用:android:clearTaskOnLaunch="true" 到 list 中的 Splash Activity ,只需将向下代码应用到菜单 Activity :

     @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
      if (keyCode == KeyEvent.KEYCODE_BACK) {
       moveTaskToBack(true);
         return true;}

    else if (keyCode == KeyEvent.KEYCODE_HOME) { 
     Intent i=new Intent(Menu.this,Login.class);
       startActivity(i);
          finish();
        return true;}
    return super.onKeyDown(keyCode, event);}

最佳答案

如果我理解正确,您的目标是用户在返回您的应用程序时必须再次输入用户名和密码。所以我认为实现这一点最合乎逻辑的方法是在所有 Activity onResume() 方法中添加一个检查,以查看您是否有用户名和密码,如果没有,只需转到登录 Activity .最简单的方法是让一个 BaseActivity 实现检查并让您的所有其他 Activity (spash 和登录除外)继承自该 BaseActivity。

伪 java 代码

class BaseActivity extends Activity {

    onResume() {
        super.onResume();
        if (!havingUsernameAndPassword()) {
            startActivity(loginActivity);
            finish();
        }
    }
}

class AnyOfYourActivitiesExceptSpashAndLogin extends BaseActivity {

    onResume() {
        super.onResume();
        // ... further code
    }

    // ... further code
}

havingUsernameAndPassword() 的实现当然取决于您如何在登录 Activity 中存储用户名和密码。一种非常简单的方法是将它们存储在一些静态类成员中,这样只要应用程序运行它们就会存在。

更新:一个更具体的例子

我制作了一个新示例,还展示了如何在登录时保存登录数据以便稍后进行检查。实际上,只有一个标志“loggedIn”和一些用户 ID 会更有意义,但这取决于您的实现,所以我会在这里坚持使用用户名/密码。

class SimpleDataHolder {
    public static String username = null;
    public static String password = null;
}

class LoginActivity extends Activity {

    // ...
    // when user has entered valid username/password, store them in SimpleDataHolder:
    SimpleDataHolder.username = username;  // <-- store username entered
    SimpleDataHolder.password = password;  // <-- store password entered
}

class BaseActivity extends Activity {

    onResume() {
        super.onResume();
        if (SimpleDataHolder.username == null || SimpleDataHolder.password == null) {
            startActivity(loginActivity); // <-- go to login
            finish();                     // <-- end current activity
        }
    }
}

class AnyOfYourActivitiesExceptSpashAndLogin extends BaseActivity {

    // ... your existing code (if any)

    onResume() {
        super.onResume();  // <-- this calls BaseActivity.onResume() which checks username/password
        // ... your existing code (if any)
}

关于java - 始终返回登录屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12868396/

相关文章:

java - Eclipse 不显示 javadoc

android - Jetpack Compose - 如何获得 Composable 的禁用/褪色外观?

java泛型方法警告 "Unchecked cast"

android - Text to Speech 不能在 API 级别 30 中工作,而不是英语

error-handling - ActionBar问题

java - 为java项目生成许可证 key

java - 对象从上下文中删除,但未从显示中删除

java - 无法从选择框获取值到 servlet

Android - WifiManager disableNetwork() 和 disconnect() 之间有什么区别

java - 何时使用权限 WRITE_CONTACT 和 READ_CONTACT?