私は、ホームページ上のアプリケーションを介してナビゲーションするためのボタンがあるアプリケーションを持っています。
そのページに私はボタンをクリックするとアプリケーションアイコンがある電話のホームスクリーンに行くべきである「終了」ボタンがあります。
どうやってやるの?
Androidの設計では、アプリケーションを好みで終了させるのではなく、OSによって管理しています。 Homeアプリケーションは、対応するIntentによって起動できます。
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
このようなことを試すことができますか
私たちのアプリケーションでは、いくつかのアクティビティ(たとえば10)があり、このアクティビティから直接終了する必要があるとします。できることは、インテントを作成してルートアクティビティに移動し、インテントに次のようにフラグを設定することです。
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
また、意図にブール値のようないくつかの余分なものを追加する
intent.putExtra("EXIT", true);
次に、ルートアクティビティで、ルートアクティビティのonCreate()
で、boolean
の値を確認し、その呼び出しに従ってfinish()を呼び出します。
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
System.exit(0);
おそらくあなたが探しているものです。それは全体のアプリケーションを閉じて、ホーム画面にあなたを連れて行きます。
これは私にはうまくいきます。
以下のように、以前のすべての活動を閉じます。
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("Exit me", true);
startActivity(intent);
finish();
それからMainActivity onCreate()メソッドでこれを追加してMainActivityを完成させます。
setContentView(R.layout.main_layout);
if( getIntent().getBooleanExtra("Exit me", false)){
finish();
return; // add this to prevent from doing unnecessary stuffs
}
メソッドfinish();
を使って最初にアプリケーションを終了する
次に、Forceを削除するためにonDestroyに以下の行を追加しますclose
Android.os.Process.killProcess(Android.os.Process.myPid());
super.onDestroy();
アクティビティを終了したい場合は、単にfinish()
を呼び出すことができます。しかし、画面上に終了ボタンを表示するのは悪い習慣です。
Androidアプリケーションを終了することはお勧めできません。詳しくは question をご覧ください。
ユーザーは、ホームボタンまたは最初のアクティビティで戻るボタンを使っていつでもアプリを終了できます。
スプラッシュスクリーンアクティビティ、ウェルカムスクリーンアクティビティ、確認ウィンドウなどの戻るボタンが押されたときに、実際には再び開きたくないアクティビティがあります。実際にはアクティビティスタックでこれは必要ありません。 => open manifest.xmlファイルを使ってこれを行い、属性を追加することができます。
Android:noHistory = "true"
これらの活動に。
<activity
Android:name="com.example.shoppingapp.AddNewItems"
Android:label=""
Android:noHistory="true">
</activity>
OR
時にはあなたは特定の戻るボタンを押してアプリケーション全体を閉じることを望みます。ここでのベストプラクティスは、アプリケーションを終了するのではなくホームウィンドウを開くことです。そのためにはonBackPressed()メソッドをオーバーライドする必要があります。通常このメソッドはスタックの一番上のアクティビティを開きます。
@Override
public void onBackPressed(){
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);
}
OR
戻るボタンを押すと、そのアクティビティを終了したいのですが、アクティビティスタックに追加したくないでしょう。 onBackPressed()メソッド内でfinish()メソッドを呼び出します。アプリケーション全体を閉じることはありません。スタックの前のアクティビティに移動します。
@Override
public void onBackPressed() {
finish();
}
(私は以前の答えを試しましたが、いくつかの点で欠けています。例えば、アクティビティ終了後にreturn;
を実行しない場合、残りのアクティビティコードが実行されます。 )あなたはランタイムエラーが発生します)
MainActivity
とChildActivity
があるとします。
Inside ChildActivityにこれを追加します。
Intent intent = new Intent(ChildActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
return true;
MainActivityのonCreate内にこれを追加します。
@Override
public void onCreate(Bundle savedInstanceState) {
mContext = getApplicationContext();
super.onCreate(savedInstanceState);
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
return;
}
// your current codes
// your current codes
}
アプリに関連するスタック内のすべてのタスクを閉じるためにFinishAffinityメソッドを使用するという別のオプションもあります。
これが私がしたことです:
SomeActivity.Java
@Override
public void onBackPressed() {
Intent newIntent = new Intent(this,QuitAppActivity.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newIntent);
finish();
}
QuitAppActivity.Java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
finish();
}
基本的にあなたがしたことはスタックからすべてのアクティビティをクリアしてQuitAppActivity
を起動することで、タスクは終了します。
そのアクティビティのfinish onDestroy()が呼び出され、アクティビティスタックの前のアクティビティに戻ります。
オブザーバモードでやった。
オブザーバインタフェース
public interface Observer {
public void update(Subject subject);
}
ベース科目
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
public void attach(Observer observer){
observers.add(observer);
}
public void detach(Observer observer){
observers.remove(observer);
}
protected void notifyObservers(){
for(Observer observer : observers){
observer.update(this);
}
}
}
子サブジェクトはexitメソッドを実装しています
public class ApplicationSubject extends Subject {
public void exit(){
notifyObservers();
}
}
あなたのアプリケーションがそれを拡張する必要があるMyApplication
public class MyApplication extends Application {
private static ApplicationSubject applicationSubject;
public ApplicationSubject getApplicationSubject() {
if(applicationSubject == null) applicationSubject = new ApplicationSubject();
return applicationSubject;
}
}
基本アクティビティ
public abstract class BaseActivity extends Activity implements Observer {
public MyApplication app;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
app = (MyApplication) this.getApplication();
app.getApplicationSubject().attach(this);
}
@Override
public void finish() {
// TODO Auto-generated method stub
app.getApplicationSubject().detach(this);
super.finish();
}
/**
* exit the app
*/
public void close() {
app.getApplicationSubject().exit();
};
@Override
public void update(Subject subject) {
// TODO Auto-generated method stub
this.finish();
}
}
テストしましょう
public class ATestActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
close(); //invoke 'close'
}
}
私は次のコードスニペットを使用してアプリケーションを終了しようとしました、これはそれが私のために働いた。これがお役に立てば幸いです。私は2つの活動で小さなデモをしました
最初の活動
public class MainActivity extends Activity implements OnClickListener{
private Button secondActivityBtn;
private SharedPreferences pref;
private SharedPreferences.Editor editer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
secondActivityBtn=(Button) findViewById(R.id.SecondActivityBtn);
secondActivityBtn.setOnClickListener(this);
pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
editer = pref.edit();
if(pref.getInt("exitApp", 0) == 1){
editer.putInt("exitApp", 0);
editer.commit();
finish();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.SecondActivityBtn:
Intent intent= new Intent(MainActivity.this, YourAnyActivity.class);
startActivity(intent);
break;
default:
break;
}
}
}
その他の活動
public class YourAnyActivity extends Activity implements OnClickListener {
private Button exitAppBtn;
private SharedPreferences pref;
private SharedPreferences.Editor editer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_any);
exitAppBtn = (Button) findViewById(R.id.exitAppBtn);
exitAppBtn.setOnClickListener(this);
pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
editer = pref.edit();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.exitAppBtn:
Intent main_intent = new Intent(YourAnyActivity.this,
MainActivity.class);
main_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(main_intent);
editer.putInt("exitApp",1);
editer.commit();
break;
default:
break;
}
}
}
100%正常に動作します。これはアプリを終了するonClick(メソッド)のコードです。
Button exit = (Button)findViewById(R.id.exitbutton);
exit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
Android.os.Process.killProcess(Android.os.Process.myPid());
System.exit(1);
Toast.makeText(getApplicationContext(), "Closed Completely and Safely", Toast.LENGTH_LONG).show();
}
});
finish();
のonDestroy()
の後に次の行を追加してください。
Android.os.Process.killProcess(Android.os.Process.myPid());
super.onDestroy();
あなたがアプリケーションを終了したい場合は、あなたの関数の下にこのコードを入れて
public void yourFunction()
{
finishAffinity();
moveTaskToBack(true);
}
//For an instance, if you want to exit an application on double click of a
//button,then the following code can be used.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 2) {
// do something on back.
From Android 16+ you can use the following:
finishAffinity();
moveTaskToBack(true);
}
return super.onKeyDown(keyCode, event);
}