始终返回登录屏幕

and*_*qq6 6 java android android-manifest

我有一个应用程序开始Splash activity screen5秒然后打开Login activity screen然后你打开正确的用户和密码Menu activity (listActivity)然后每行点击打开MyCity activity.

更新:

我想要得到的是:你在我的应用程序中的任何地方,你出于任何原因离开我的应用程序,不仅是当你按下主页按钮而且还有FOR EXPLPLES:

  1. 您按主页按钮检查另一个应用程序然后想要返回到我的应用程序.

  2. 您有关于whatsup或电子邮件的通知显示新消息,您打开您的whatsup或打开电子邮件,然后返回到我的应用程序.

3-您离开手机一段时间后再想检查我的应用程序.

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

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

我呼吁finish();Splash活动和登录活动.

我尝试过:android:clearTaskOnLaunch="true"在清单中的Login活动中,但它确实没有.

任何建议将被认真考虑,

请写完整的工作代码.

登录活动:

 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(); }
            }   }               
                    });  }  }
Run Code Online (Sandbox Code Playgroud)

菜单活动:

  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();
                            }
                    }}
Run Code Online (Sandbox Code Playgroud)

MyCity活动:

   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)));}


    }}
Run Code Online (Sandbox Code Playgroud)

我的表现:

<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>
Run Code Online (Sandbox Code Playgroud)

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

通过应用 android:clearTaskOnLaunch="true"Splash活动,

并阻止菜单活动上的后退按钮行为:

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

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

直接进入登录活动.

但现在的主要目标是:

如果:

屏幕在您离开手机时锁定,或轻按电源按钮以锁定手机.

要么

通知中打开的消息

要么

打开电子邮件 通知

要么

你有CALL并回答它,

然后返回我的应用程序,它不会进入登录活动,但您将返回到您所在的页面.

请提出任何建议,谢谢.

最新消息:

我使用另一个代码覆盖主页按钮并控制后退按钮,而不是应用:android:clearTaskOnLaunch="true"清单中的Splash活动,只需将下行代码应用于菜单活动:

     @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);}
Run Code Online (Sandbox Code Playgroud)

Rid*_*lly 7

如果我理解正确,那么您的目标是当用户返回您的应用时,必须再次输入用户名和密码.所以我认为实现这一目标最合乎逻辑的方法是在所有的Activity onResume()方法中添加一个检查,看看你是否有用户名和密码,如果没有,只需转到登录活动即可.最简单的方法是让BaseActivity实现检查,让所有其他活动(spash和login除外)继承该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
}
Run Code Online (Sandbox Code Playgroud)

havingUsernameAndPassword()当然,实施取决于您在登录活动中存储用户名和密码的方式.一种非常简单的方法是将它们存储在一些静态类成员中,因此只要应用程序运行它们就能存活.

更新:一个更具体的例子

我做了一个新的例子,展示了如何在登录时保存登录数据,以便稍后检查.实际上,只有一个标志'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)
}
Run Code Online (Sandbox Code Playgroud)


She*_*tib 2

这是我想出的解决方案。

请下载博文末尾的项目并进行测试。

测试于:

  • 三星 S3 运行 Android 4.0.4
  • 运行 android 2.3.1 的模拟器

基本思想:我们将创建一个 RequireLoginActivity,它将由除 LoginActivity 之外的所有活动扩展。

调用onResume函数时应捕获三种情况:

  1. 使用 startActivity 的风格从一个 RequireLoginActivity 跳转到另一个 RequireLoginActivity。
  2. 通过完成当前活动从一个 RequireLoginActivity 跳回上一个 RequireLoginActivity。
  3. 隐藏 RequireLoginActivity 后返回到它(我们应该在这里显示登录信息!)

我的解决方案的基本思想是有 2 个计数器:已启动活动的数量 ( startCounter ) 和已暂停活动的数量 ( pauseCounter )。每次活动开始时,我们都会增加startCounter。同样,当活动暂停时,pauseCounter应该递增。在我们的onResume函数中,我们将通过比较 2 个计数器来决定是否进入登录。如果 2 个计数器相等,我们将 gotoLogin()!

让我解释一下:在任何时候,都可以捕获第 1 种情况,因为在开始新活动时,我们的startCounter将始终比PauseCounter大1。这是事实,因为我们始终会启动一个额外的活动,但不会暂停。

此外,情况 3 很容易捕获,因为一旦您离开我们的应用程序(例如使用 HOME 按钮),我们将增加暂停计数器,并且 2 个计数器将变得相等。一旦应用程序恢复,onResume将决定转到GotoLogin ()。

情况 2 有点棘手,但也很简单。诀窍是重写finish () 函数,并在其中将startCounter递减一次,将pauseCounter 递减两次。请记住,当完成活动时,onPause被调用并且我们的计数器是相等的。现在,通过减少startCounter一次和pauseCounter两次,我们最终返回到前一个活动的计数器值,并且当前一个活动恢复时, startCounter将保持比pauseCounter大1。