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