6

アプリSplash activity screenを5秒間起動してから開きLogin activity screen、正しいユーザーとパスワードを開いたMenu activity (listActivity)後、各行をクリックして開きMyCity activityます。

アップデート:

私が取得しようとしているのは、あなたが私のアプリのどこにいても、ホームボタンを押したときだけでなく、何らかの理由で私のアプリから離れた場合の例です:

  1. ホームボタンを押して別のアプリをチェックしてから、私のアプリに戻りたい.

  2. whatsup または email に新しいメッセージを表示する通知があり、whatsup または open email を開いてから my app に戻ります。

3-一定期間携帯電話を離れた後、もう一度アプリを確認したい.

4-電源ボタンを押して電話を閉じ(画面をロック)、ロックを開いてアプリに戻りたい.

なんらかの理由でアプリを離れたときにいつでも意味しますが、アプリ全体を終了してから再びアプリに戻りたい場合は、ログイン画面を開いてユーザーとパスワードを再入力する必要があります。

finish();Splash アクティビティと Login アクティビティの両方を呼び出しました。

私は試しました:android:clearTaskOnLaunch="true"マニフェストのログインアクティビティで、それはうまくいきません。

アドバイスをいただければ幸いです。

完全な動作コードを書いてください。

ログイン アクティビティ:

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

メニュー アクティビティ :

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

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


    }}

私のマニフェスト:

<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>

2番目の更新:私は私が望むものの半分に達しましたが、それでも達成できないいくつかのステップは以下のように説明されています:

android:clearTaskOnLaunch="true"スプラッシュ活動に応募 することで、

メニューアクティビティで戻るボタンの動作を防ぎます:

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

SO今すぐホームボタンを押してアプリを離すと、アプリに戻ります:

ログイン アクティビティに直接移動します。

しかし、今の主な目標は次のとおりです。

もしも :

携帯電話から離れているときは画面がロックされているか、電源ボタンを軽く押して携帯電話をロックします。

また

通知からのOPENED MESSAGE

また

通知からOPENED EMAIL

また

あなたはCALLを持っていてそれに答えます、

その後、私のアプリに戻ります。ログイン アクティビティにはなりませんが、以前のページに戻ります。

アドバイスをお願いします、ありがとう。

盗まれた更新:

適用するのではなく、ホームボタンをオーバーライドして戻るボタンを制御する別のコードを使用しました:android:clearTaskOnLaunch="true"マニフェストのスプラッシュアクティビティに、メニューアクティビティにダウンコードを適用するだけです:

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

15 に答える 15

8

私があなたを正しく理解している場合、あなたの目標は、ユーザーがアプリに戻ったときにユーザー名とパスワードを再度入力する必要があることです。したがって、これを実現する最も論理的な方法は、すべてのアクティビティonResume()メソッドにチェックを追加して、ユーザー名とパスワードがあるかどうかを確認し、そうでない場合はログイン アクティビティに移動することだと思います。最も簡単な方法は、BaseActivity にチェックを実装させ、他のすべてのアクティビティ (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()、ログインアクティビティでユーザー名とパスワードをどのように保存するかによって異なります。非常に簡単な方法は、それらをいくつかの静的クラスメンバーに格納することです。これにより、アプリケーションが実行されている限り存続します。

更新: より具体的な例

ログイン時にログインデータを保存して後で確認できるようにする方法を示す新しい例も作成しました。実際には、フラグ「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)
}
于 2012-11-02T10:06:42.920 に答える
4

アプリケーションは、フレームワークコードを変更せずにホームボタンを再ルーティングすることはできません。申し訳ありませんが、これは不可能です...

于 2012-10-27T23:47:35.417 に答える
4

2 番目の更新の問題に対しては、OnResume()メソッドをオーバーライドすることをお勧めしますが、その中で行うことには注意する必要があります。また、 Android のライフサイクルがどのように機能するかについても学習することをお勧めします。

于 2012-10-31T13:52:33.643 に答える
3

これが私の提案です: exitと呼ばれるin

を持ってください。exit の値をfalseに設定します。keySharedPreferencesonCreate()

public void onCreate(Bundle ..)
{
 SharedPreferences preferences=PreferenceManager.getDefaultSharedPreferences(context);
 SharedPreferences.Editor editor=preferences.edit();
 editor.putString("exit","false");
 editor.commit();
 .....  
}

次に、exitonResume()の値を確認します。true の場合、ユーザーをログイン画面に移動します。それ以外の場合は何もしません。

public void onResume()
{
 super.onResume();
 SharedPreferences preferences=PreferenceManager.getDefaultSharedPreferences(context);
 String exit=preferences.getString("exit","");
 if(exit.equals("true"))
 {
   Intent i=new Intent(this_activity.thi,login_activity.class);
   startActivity(i);
  finish()
 }
}

次に、onPause()exit の値をtrueに設定します。

public void onPause()
{
 super.onPause();
 SharedPreferences preferences=PreferenceManager.getDefaultSharedPreferences(context);
     SharedPreferences.Editor editor=preferences.edit();
     editor.putString("exit","true");
     editor.commit();
}

お世話になったとおっしゃっていましたbackbutton。次に、これでうまくいくはずです。アプリは常にログイン画面に戻ります。

于 2012-11-02T03:58:06.887 に答える
2

これが私が思いついた解決策です。

ブログ投稿の最後にあるプロジェクトをダウンロードしてテストしてください。

テスト済み:

  • Android 4.0.4 を実行している Samsung S3
  • Android 2.3.1 を実行するエミュレータ

基本的な考え方: LoginActivity を除くすべてのアクティビティによって拡張される RequireLoginActivity を作成します。

onResume関数が呼び出されると、次の 3 つのケースをキャプチャする必要があります。

  1. startActivity のフレーバーを使用して、ある RequireLoginActivity から別の RequireLoginActivity にジャンプします。
  2. 現在のアクティビティを終了することにより、ある RequireLoginActivity から前の RequireLoginActivity に戻るジャンプ。
  3. 非表示にした後で RequireLoginActivity に戻る (ここでログインを表示する必要があります!)

私のソリューションの基本的な考え方は、開始されたアクティビティの数 ( startCounter ) と一時停止されたアクティビティの数( pauseCounter ) の 2 つのカウンターを持つことです。アクティビティが開始するたびに、startCounterをインクリメントします。同様に、アクティビティが一時停止すると、pauseCounterをインクリメントする必要があります。onResume関数では、2 つのカウンターを比較してサインインするかどうかを決定します2 つのカウンターが等しい場合は、gotoLogin() を実行します。

説明させてください: 新しいアクティビティを開始すると、startCounterは常にpauseCounterよりも 1 大きいため、ケース 1 はいつでもキャプチャできます。

また、ケース 3 は簡単にキャプチャできます。たとえば、HOME ボタンを使用してアプリを終了すると、pauseCounterがインクリメントされ、2 つのカウンターが等しくなるためです。アプリが再開されると、onResumeはgotoLogin ()を決定します。

ケース 2 は少しトリッキーですが、単純でもあります。秘訣は、finish () 関数をオーバーライドし、その中でstartCounterを 1 回、pauseCounterを 2 回デクリメントすることです。アクティビティを終了すると、onPauseが呼び出され、カウンターが等しいことに注意してください。ここで、startCounterを 1 回、pauseCounterを 2 回デクリメントすることで、最終的に前のアクティビティのカウンターの値に戻り、前のアクティビティが再開されたときにstartCounterはpauseCounterよりも 1大きいままになります。

于 2012-11-01T10:09:59.540 に答える
2

Another workaround will be to create a activity(FinisherActivity) and call finish() in its onCreate() method. Then whenever you need to finish a activity on pressing the home button or back button and prevent it from staying on the stack just use an Intent to call FinisherActivity . But remember to setFlags for the intent to Intent.FLAG_ACTIVITY_CLEAR_TOP...I know its not an efficient approach, but it should work..

于 2012-10-30T12:13:41.010 に答える
1

実際、私はあなたの質問が正確に何であるか確信が持てないと思います.Androidデバイスに組み込まれているホームキーを押して、アクティビティを開始しますか?

ホームキーリスナー

これを試してみてください: ログイン アクティビティを呼び出す意図があるだけで、それが機能する場合は素晴らしいです

@Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.KEYCODE_HOME) { 
            Toast.makeText(MainActivity.this, "Home Key is pressed
                    Toast.LENGTH_LONG).show();
            return true;
        }
        Toast.makeText(MainActivity.this, "Didnt work", Toast.LENGTH_SHORT)
                .show();
        return super.dispatchKeyEvent(e);
    };
于 2012-10-12T23:51:58.830 に答える
1

あなたのコードはほぼ正しいです: アプリケーションの起動時にアクティビティ スタックをクリアするには、ルート activity に追加するandroid:clearTaskOnLaunch="true" 必要あります。SplashLogin

ドキュメントから:

この属性は、新しいタスクを開始するアクティビティ (ルート アクティビティ) に対してのみ意味があります。タスク内の他のすべてのアクティビティでは無視されます。

したがって、マニフェスト内の属性を から に移動するLoginSplash、それが機能するはずです。アプリケーションは常にスプラッシュスクリーンで開始されます。

更新:着信、画面ロック、または通知でもアプリを再起動するには、他のすべてのアクティビティにandroid:noHistory="true"(docs herefinish() ) を追加するか、すべてのonPause()メソッドを呼び出す必要があります。

あなたが達成したいことはAndroidのコアコンセプトに完全に反しているため、私たちの答えは非常に異なっていて複雑であることに言及する価値があります(たとえば、アプリの終了に関する良い記事があります)。アプリ。

于 2012-10-28T09:55:00.663 に答える
1

Android マニフェストで (アクティビティごとに) android:noHistoryアクティビティ属性を試しましたか? それはまさにあなたが探しているもののように聞こえます。

于 2012-10-29T19:53:02.627 に答える
1

Login アクティビティを除くfinish()すべてのアクティビティのメソッドを呼び出す必要があります。そして、彼らのメソッドonPause()を呼び出すことができます。そのため、アクティビティがフォアグラウンドになるたびに、ユーザーは再度ログイン ページにリダイレクトされます。startActivity(new Intent (this, LoginPage.this))onResume()

于 2012-11-02T09:16:50.650 に答える
1

あなたが求めているものを正確に伝えるのは難しいですが、これがあなたが探しているものだと思います:アプリが既にメモリにある場合、スプラッシュ画面をロードしないようにする方法. そこでの私の投稿を要約すると:

これは設計上の問題です。ランチャー アクティビティは、スプラッシュ スクリーン アクティビティであってはなりません。代わりに、メイン アクティビティの onCreate メソッドでスプラッシュ アクティビティを開きます。そうすれば、それが新たに開かれると、 onCreate が呼び出され、スプラッシュ画面が表示されます。それ以外の場合、onResume を呼び出すアプリが単に再開された場合、スプラッシュ スクリーン アクティビティを開く呼び出しはありません。

次に、マニフェストを次のように変更できます。

<activity
        android:name=".ui.MainActivity"
        android:noHistory="true"
        android:screenOrientation="portrait"
        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=".ui.SplashActivity"/>
于 2012-10-29T05:23:50.557 に答える
1

ホームボタンはランチャーアプリケーションの呼び出し専用であるため不可能ですが、アプリをランチャーアプリケーションにすることはできます。たとえば、キオスクモードで実行して、それを参照しください

ランチャー アクティビティでアクティビティをオンにするには、これを manifest.xml の itentfilter に追加します。

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.HOME" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
于 2012-10-28T05:58:43.830 に答える
1

ホーム ボタンのデフォルトの動作をオーバーライドすることはできません。戻るボタンをクリックすると、目的の結果が得られます。ホーム ボタンのデフォルトの動作は、ホーム画面に移動することです。私の提案は、戻るボタンをオーバーライドします。次に、インテントと設定フラグを適切に使用して、ログイン画面に移動できます。

   @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        super.onKeyDown(keyCode, event);
        switch(keyCode)
        {
        case KeyEvent.KEYCODE_BACK:
        Intent i= new Intent("yourpackage.login"); 
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |Intent.FLAG_ACTIVITY_NO_HISTORY); 
        startActivity(i);
        finish();
        break;  
        }
        return super.onKeyDown(keyCode, event);
    }
于 2012-10-13T06:27:55.843 に答える
1

あなたが求めているのは、アンドロイドの仕組みに反することです。

ユーザーがホーム ボタンを押すと、アプリに戻ったときに、長い間そこにいなかったり、リソースを消費するアプリを実行したりしない限り、すべてが元のままであることが期待されます。

Windows の場合と同様に、ALT+TAB をクリックすると、メール クライアント (またはメッセンジャー、または使用するアプリ) にログインが表示されるとは思われません。

いずれにせよ、onWindowFocusChanged を任意のアクティビティ関数(onResume、onStart、onRestart、onPause、onStop、...) と一緒に使用して、使用したい関連ケースのみを処理できます。

于 2012-10-22T23:50:50.837 に答える
0

私の小さな努力があなたを助けるかもしれません、私はHOMEボタンをうまくオーバーライドしました(Android 4.0以下)

要件に応じてコードを成形できます。

SOに関する回答

GITHUB のソース

ホームボタンを処理できるようになったため、アプリケーションフローを実行する独自のロジックを簡単に作成できます。

これはあなたが対象とするイベントです

@Override
    public boolean dispatchKeyEvent(KeyEvent event) {

        if ( (event.getKeyCode() == KeyEvent.KEYCODE_HOME) && isLock) {
             //Logic when Home button pressed
            return true;
        }
        else
            return super.dispatchKeyEvent(event);
    }

これが私たちの要件を確実に満たすことを願っています。

注:これはすべて、Home管理できる他のユーザーのボタンをキャプチャするためのものです

于 2012-11-01T04:27:43.530 に答える