androidexit
① 怎麼在android實現退出功能
Android Studio中,隨時隨地的退出程序(記得導入相應的包,可以設置自動導入所需的包的,下面的代碼還沒有導入包的部分):
①新建一個 ActivityCollector 類,作為活動管理器,代碼如下所示:
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
public static void finishAll() {
for (Activity activity : activities)
{
if(!activity.isFinishing())
{
activity.finish();
}
}
activities.clear();
//以下是殺死當前程序進程的代碼,保證程序徹底退出。
android.os.Process.killProcess(android.os.Process.myPid());
}
}
②再新建一個類BaseActivity,並讓所有活動繼承這個類,也就是其他的全部活動都改為extends BaseActivity,而不是原來的extends AppCompatActivity。
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
③在你想要退出程序的頁面(Activity)的setContentView(R.layout.*****); 下面加上如下代碼,從而實現點擊一個按鈕退出整個程序。
Button button3 = (Button) findViewById(R.id.*****);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ActivityCollector.finishAll();
}
});
//*號部分看具體情況而定
② 關於android中 關閉程序 exit 和finish 的區別是什麼
當你在程序中調用 Activity.finish()方法時,結果和用戶按下 BACK 鍵一樣:他告訴 Activity Manager該Activity實例可以被「回收」。隨後 Activity Manager 激活處於棧第二層的 Activity 並重 新入棧,把原 Activity 壓入到棧的第二層,從 Running ..
③ android 開發應用程序中,退出功能怎麼做啊
可以使用java的回收機制,也能使用android特有的活動生存周期,以下方法均可嘗試使用:
1.System.gc(); 提示系統回收資源
2.System.exit(0); 系統退出
3.this.finish();在activity中調用結束該活動,如果是唯一運行的活動則應用程序結束
4.onDestroy();activity結束時調用,可以寫一些釋放資源的程序
④ android中調用exit(0)時無法退出程序,因為有一個activity沒有finish,如何在別的頁面finish掉它
android.os.Process.killProcess(android.os.Process.myPid());
⑤ Android使用System.exit;會黑屏下怎麼處理
Android只並不是調用System.exit來退出應用的。調用System.exit(0); 會黑一下屏幕是因為當前這個Activity重新onCreate了一次。在Android中,Activity有個棧,一個Activity結束掉,會回到上一個Activity,並不是退出應用程序。
Android中,退出應用程序的方式:
1.通過pid
int pid = android.os.Process.myPid(); //獲取當前應用程序的PID
android.os.Process.killProcess(pid); //殺死當前進程
這種方法退出應用,是會保留某些後進程,例如:Service,Notifications等。
2.通過ActivityManager
ActivityManager manager = (ActivityManager)context.getSystemService(ACTIVITY_SERVICE); //獲取應用程序管理器
manager.killBackgroundProcesses(getPackageName()); //強制結束當前應用程序
這種方式退出應用,會結束本應用程序的一切活動,因為本方法會根據應用程序的包名殺死所有進程包括Activity,Service,Notifications等。
⑥ android平台中exit按鈕實現退出到主菜單,函數怎麼實現
調用finish()方法,程序還保存之前的數據狀態,如果退出時再加一句:System.exit(0);就之前的數據狀態就沒有了。
⑦ 在android中 。 為什麼用了 System.exit(0); 會黑一下屏幕刷新該頁面
Android只並不是調用System.exit來退出應用的。調用System.exit(0); 會黑一下屏幕是因為當前這個Activity重新onCreate了一次。在Android中,Activity有個棧,一個Activity結束掉,會回到上一個Activity,並不是退出應用程序。 Android中,退出應用程序的方式: 1.通過pid int pid = android.os.Process.myPid(); //獲取當前應用程序的PID android.os.Process.killProcess(pid); //殺死當前進程 這種方法退出應用,是會保留某些後進程,例如:Service,Notifications等。 2.通過ActivityManager ActivityManager manager = (ActivityManager)context.getSystemService(ACTIVITY_SERVICE); //獲取應用程序管理器 manager.killBackgroundProcesses(getPackageName()); //強制結束當前應用程序 這種方式退出應用,會結束本應用程序的一切活動,因為本方法會根據應用程序的包名殺死所有進程包括Activity,Service,Notifications等。
⑧ android 怎麼把進程結束掉
1、自己結束自己 this.finish();
2、killProcess(int pid)
例子:android.os.Process.killProcess(android.os.Process.myPid());
對於這個方法,需要詳細解釋一下。在SDK的文檔中,解釋如下:
Kill the process with the given PID. Note that, though this API allows us to request to kill any process based on its PID, the kernel will still impose standard restrictions on which PIDs you are actually able to kill. Typically this means only the process running the caller's packages/application and any additional processes created by that app; packages sharing a common UID will also be able to kill each other's processes.
英語不好,不能准確翻譯,所以希望大家自己理解,免得對大家造成誤解。我個人對這句話的解釋就是,這個方法使用是有條件的:
a、將被殺掉的進程 和 當前進程 處於同一個包或者應用程序中;
b、將被殺掉的進程 是由當前應用程序所創建的附加進程;
c、將被殺掉的進程 和 當前進程 共享了普通用戶的UID。(這里的普通用戶,是相對於Root許可權的用戶來說的)
3、System.exit(int code)
例子:System.exit(0);
該方法只能用於結束當前進程自身,個人覺得在程序遇到異常,無法正常執行時,可以通過這個方法強制退出。
需要注意的是,這兩個方法,會導致進程非正常退出,就是說,進程退出時不會去執行onPause、onStop和onDestroy方法,那麼進程很有可能錯過了保存數據的機會。因此,這兩個方法最好使用在出現異常的時候!
4、killBackgroundProcesses(String packageName)
要通過一個進程去結束另一個進程。在之前的SDK版本中,一直使用方法restartPackage(packageName)方法,但是在Android的開發文檔中介紹說,這個函數會導致一些問題( the previous behavior here is no longer available to applications because it allows them to break other applications by removing their alarms, stopping their services, etc.),所以建議大家使用一個新的方法:
由於這個方法沒有返回值,所以我們也不知道我們的目標進程是否真的退出了。但是,我目前只發現了這個可以結束另一個進程的方法。此方法需要許可權:
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
5、利用反射調用forceStopPackage來結束進程
Java代碼
Method forceStopPackage = am.getClass().getDeclaredMethod("forceStopPackage", String.class);
forceStopPackage.setAccessible(true);
forceStopPackage.invoke(am, yourpkgname);
注意:
需要在manifest里加上shareid定義:android:sharedUserId="android.uid.system"
需要在manifest里加上許可權:<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"></uses-permission>
需要採用系統platform簽名,因為需要用FORCE_STOP_PACKAGES許可權,該許可權只賦予系統簽名級程序,然後經編譯環境重新編譯,即可實現強制停止指定程序(本人親自驗證可行)
6、killall -HUP packageName || kill -9 pid
Java代碼
String cmd="killall -HUP com.android.test";
try {
Process process = Runtime.getRuntime().exec(cmd);
BufferedReader in = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println("exec shell: == " + line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
此方法理論上可行,但是應該需要系統級或底層的協助
⑨ 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。
⑩ 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()