1

私はさまざまな活動をしているアプリケーションを持っています。1アクティビティで、ユーザーが戻るボタンを押したときにアプリを閉じてホーム画面を表示させたい

コード

public boolean onKeyDown(int keyCode, KeyEvent event) 
        {
            //Handle the back button
            if(keyCode == KeyEvent.KEYCODE_BACK) 
                {
                    //Ask the user if they want to quit
                    new AlertDialog.Builder(this)
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .setTitle("Exit")
                    .setMessage("Really Exit ?")
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() 
                        {
                            public void onClick(DialogInterface dialog, int which) 
                                {
                                 Intent intent = new Intent(Intent.ACTION_MAIN);
                                intent.addCategory(Intent.CATEGORY_HOME);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                startActivity(intent);
                                }
                        })
                    .setNegativeButton("No", null)
                    .show();
                    return true;
                }
            else 
                {
                return super.onKeyDown(keyCode, event);
                }
        }

これを実行して戻るボタンを押すとホーム画面が表示されるのですが、2回目に実行するとコンソール出力が

ActivityManager: 警告: アクティビティが開始されていません。現在のタスクが最前面に移動されました。

そして、戻るボタンが押されたアクティビティが表示されます。アプリケーションが強制終了されず、バックグラウンドで実行されると思います。言及しておくと、これは私のアプリケーションの開始アクティビティではありません。

誰かが私を助けてくれませんか、私は初心者です。

4

7 に答える 7

4

このコードを試してください:

@Override
public void onBackPressed()
{
      moveTaskToBack(true);
}

こちらのリンクもチェック

于 2012-06-18T04:54:17.677 に答える
3

他のアクティビティに入るために使用したすべてのインテントについて、インテントを渡すためにこの方法に従う必要が あります。以下に示すように各インテントにフラグを渡すだけで、 startActivity()を使用してアクティビティを開始した後、そのデモ コードの後に​​ finish()を追加する必要があります。以下に示すように

Intent i=new Intent(firstActivity.this,secondActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
finish();
于 2012-06-18T05:11:18.003 に答える
2

あなたの意志でアプリケーションを強制終了することはできません。Android OS は、割り当てられたリソースを解放したいときにそれを行います。android.exitアプリケーションの概念を実際に実装することはできません。ユーザーは単にあなたから離れてそこActivityに戻ることができます。最初から再開する必要がある場合、Activityまたは元の場所から再開する必要がある場合は、あなたではなく、Android OS 次第です。

この投稿を読んで、Android アプリをどのように設計すべきかという哲学と、自分の意志で終了したくない理由を理解してください

于 2012-06-18T04:48:24.017 に答える
1

finish();その行の後に追加してstartActivity(intent)、アクティビティを終了します。

ありがとう

于 2012-06-18T04:50:04.480 に答える
1

このクラスをそのままコードに含める必要があります........

  public abstract class AppBaseActivity extends Activity {
public static final String FINISH_ALL_ACTIVITIES_ACTIVITY_ACTION =    "com.hrupin.FINISH_ALL_ACTIVITIES_ACTIVITY_ACTION";
private BaseActivityReceiver baseActivityReceiver = new BaseActivityReceiver();
public static final IntentFilter INTENT_FILTER = createIntentFilter();

private static IntentFilter createIntentFilter(){
    IntentFilter filter = new IntentFilter();
    filter.addAction(FINISH_ALL_ACTIVITIES_ACTIVITY_ACTION);
    return filter;
}

protected void registerBaseActivityReceiver() {
    registerReceiver(baseActivityReceiver, INTENT_FILTER);
}

protected void unRegisterBaseActivityReceiver() {
    unregisterReceiver(baseActivityReceiver);
}

public class BaseActivityReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(FINISH_ALL_ACTIVITIES_ACTIVITY_ACTION)){
            finish();
        }
    }
} 

protected void closeAllActivities(){
    sendBroadcast(new Intent(FINISH_ALL_ACTIVITIES_ACTIVITY_ACTION));
}
  }

次に、以下の例のように、このクラスから他のすべてのクラスを拡張する必要があります。

    public class FirstActivity extends AppBaseActivity implements OnClickListener {
/** Called when the activity is first created. */

private Button buttonOpenNextActivity;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.first);
    registerBaseActivityReceiver();
    buttonOpenNextActivity = (Button)findViewById(R.id.buttonOpenNextActivity);
    buttonOpenNextActivity.setOnClickListener(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unRegisterBaseActivityReceiver();
}

@Override
public void onClick(View v) {
    /* OPEN SECOND ACTIVITY.*/
    startActivity(new Intent(this, SecondActivity.class));
}
  }

別のクラス:

       public class SecondActivity extends AppBaseActivity implements OnClickListener {
private Button buttonOpenNextActivity;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second);
    registerBaseActivityReceiver();
    buttonOpenNextActivity = (Button)findViewById(R.id.buttonOpenNextActivity);
    buttonOpenNextActivity.setOnClickListener(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unRegisterBaseActivityReceiver();
}

@Override
public void onClick(View v) {
    /* OPEN THIRD ACTIVITY.*/
    startActivity(new Intent(this, ThirdActivity.class));
}
            }

最後のクラス:

      public class ThirdActivity extends AppBaseActivity  implements OnClickListener  {
private Button buttonCloseAllActivities;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.third);
    registerBaseActivityReceiver();
    buttonCloseAllActivities = (Button)findViewById(R.id.buttonCloseAllActivities);
    buttonCloseAllActivities.setOnClickListener(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unRegisterBaseActivityReceiver();
}

 @Override
protected void onBackPressed() {
    closeAllActivities();
    super.onBackPressed();
}
}

3 番目のアクティビティで [戻る] ボタンを押すと、他のすべてのアクティビティも完全に終了します。

1/ onCreate でレシーバーを登録し、ondestroy() で unregister() することを忘れないでください。

于 2012-06-18T05:08:47.440 に答える
0

あなたの質問は明確ではありません。

私の知る限り、アプリケーションを終了してインテントをホーム画面に渡すには、broadCastRecieverを使用する必要があります。

さらに警告は何もありません。アプリケーションを実行する前に、コードでEnterキーを押すか、smスペースを指定して保存し、アプリケーションを再実行してください。正常に動作します。

于 2012-06-18T04:51:26.167 に答える
0

バックプレスでアプリケーションを終了する場合は、その画面の戻るボタンを押したときに前のすべてのアクティビティを終了する必要があります。これには、BROADCASTRECIEVERの概念を使用する必要があります......インテントをブロードキャストしたことを意味しますそのバックプレスで、前のすべてのアクティビティを終了します。

于 2012-06-18T04:52:18.210 に答える