androidexit0
❶ android如何避免System.exit(0)帶來的在部分機型有時退出後還會再次啟動,少部分的用戶體驗不太好。
System.exit(0) 並不一定會執行了gc,可以學郭神繼承BaseActivity,寫一個收集全部activity的類,onCreate添加,onDestroy remove,調用finishAll()移除所有activity,但是我覺得繼承BaseAdapter太麻煩,而且activity越寫越多,有時候使用第三方庫又不得不繼承其他activity,而我的寫法是在郭神的思路上修改一下,在application的ActivityLifecycleCallbacks回調監聽上面去寫add 和 remove,finishAll。我前兩天看到還有一種很簡單的方法,還沒有有去實踐過,好像是這樣的:
隨便哪個activity或者fragment(getActivity()),然後調用 finishAffinity(),然後調用System.exit(0); System.gc(); 但後來我有查了下,finishAffinity()這個方法是讓當前這個Activity所在的棧內的所有Activity退棧,那麼,假設,我使用了某個使用了singleInstance 就很尷尬了,當然,也可以判斷一下,應為一般用singleinstance的也不多,isFinish()判斷一下它是否已經finish,沒有就調用一下finish()
❷ Android開發怎樣徹底退出APP我有兩個activity,在第一個activity中用system.exit(0)可以
你在第一個activity里用exit退出,只是結束了當前頁面而已,當你在第一個頁面exit因為只有一個頁面,所以可以,當有兩個以上頁面是,結束了第二個頁面就會跳到第一個頁面去,不能徹底退出。解決辦法:在配置文件里把最後你要退出的那個頁面的launchMode設置為singleTask,例如你上面說的第二個activity,你要退出的時候,直接在第二個activity里finish()就可以了。
❸ android system進程是什麼進程
Android上殺掉進程的方式有兩種,分別是System.exit(0)和Process.killProcess(Process.myPid()),那麼這兩種方式有何區別呢?
相同點
APP進程都會被直接殺掉
我們通過adb shell ps可以查看當前手機所有運行的進程狀態,
在執行完這兩種方式之後,APP進程都會消失。
生命周期都不會被調用
onPause()、onStop()和onDestory(),也包括onSaveInstanceState,這些生命周期方法都不會被調用。
不同點
影響范圍不同
System.exit(0)只會影響當前的程序;
Process.killProcess(Process.myPid())會殺掉所有PID一樣的進程,比如那些擁有相同UID的應用,統統都會被殺掉。
方式不一樣
System.exit(0)是停止程序的虛擬機;
Process.killProcess(Process.myPid()) 是通過PID去殺死進程。
補充
System.exit(0)和System.exit(1)
看官方的方法注釋,如下:
Use 0 to signal success to the calling process and 1 to signal failure.11
0:代表成功的信號;
1:代表失敗的信號,常用於捕獲到異常執行。
使用方式
從上面可以看出,這兩種方式都比較暴力,不推薦使用,尤其是現在的手機配置都很好的情況下。而且進程都被殺掉了,相應的Service也會被幹掉,如果存在推送的話,會出現各種莫名的問題。
真要用的話,也得注意:如果程序有多個Activity,最好在主Activity中的OnBackPressed()中使用,如果在其它Activity中使用的話,APP會直接退出,退出後會重啟應用,這樣對於用戶體驗不是很好。
❹ android System.exit(0)重啟上一個頁面
MainActivity代碼:直接啟動第二個Activity:
[java] view plain
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent=new Intent(MainActivity.this,NewActivity.class);
startActivity(intent);
}
}
NewActivity代碼:
[java] view plain
public class NewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button=new Button(NewActivity.this);
button.setText("退出測試");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.exit(0);
}
});
setContentView(button);
}
}
12345678910111213141516171819
此時點擊button退出應用重啟,修改MainActivity:啟動新的Activity,finish存在MainAcitvity
[java] view plain
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent=new Intent(MainActivity.this,NewActivity.class);
startActivity(intent);
this.finish();
}
}
總結:可能是因為應用棧中還存在別的activity沒有finish調,導致應用重新啟動。使用System.exit(0)時,確保任務棧中所有activity已經finish。