1
2
|
ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
|
1
|
<
uses-permission
android:name=\"android.permission.RESTART_PACKAGES\"></
uses-permission
>
|
1
2
|
android.os.Process.killProcess(android.os.Process.myPid())
//获取PID
System.exit(
0
);
//常规java、c#的标准退出法,返回值为0代表正常退出
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public
class
MyApplication
extends
Application {
//对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList实现了基于动态数组的数据结构,要移动数据。LinkedList基于链表的数据结构,便于增加删除
private
List<Activity> activityList =
new
LinkedList<Activity>();
private
static
MyApplication instance;
private
MyApplication(){ }
//单例模式中获取唯一的MyApplication实例
public
static
MyApplication getInstance() {
if
(
null
== instance) {
instance =
new
MyApplication();
}
return
instance;
}
//添加Activity到容器中
public
void
addActivity(Activity activity) {
activityList.add(activity);
}
//遍历所有Activity并finish
public
void
exit(){
for
(Activity activity:activityList) {
activity.finish();
}
System.exit(
0
);
}
}
|
1
|
MyApplication.getInstance().addActivity(
this
);
|
1
|
MyApplication.getInstance().exit();
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public
abstract
class
MyAcitivty
extends
Activity {
/**负责各个具体 Activity 的显示**/
public
abstract
void
onCreate();
@Override
public
void
onCreate(
final
Bundle savedInstanceState) {
// TODO Auto-generated method stub
super
.onCreate(savedInstanceState);
onCreate();
RegListener();
}
/**注册退出事件监听**/
public
void
RegListener() {
ExitListenerReceiver exitre =
new
ExitListenerReceiver();
IntentFilter intentfilter =
new
IntentFilter();
intentfilter.addAction(
this
.getPackageName() +
"."
+
"ExitListenerReceiver"
);
this
.registerReceiver(exitre, intentfilter);
}
class
ExitListenerReceiver
extends
BroadcastReceiver {
@Override
public
void
onReceive(Context context, Intent i) {
((Activity) context).finish();
}
}
}
|
1
2
|
Intent intent =
new
Intent(context.getPackageName()+
".ExitListenerReceiver"
);
context.sendBroadcast(intent);
|
1
|
public
boolean
static
isCloseAll=
false
;
|
1
2
3
4
5
|
@Override
onResume() {
super
.onResume();
if
(Setting.isCloseAll) finish();
}
|
1
2
|
Setting.isCloseAll=
true
;
finish();
|
1
2
3
4
5
6
7
8
9
10
|
package
com.example.android_uncatchexception;
import
android.app.Application;
public
class
MyCrashApplication
extends
Application {
@Override
public
void
onCreate() {
super
.onCreate();
//程序一启动,就将未捕获异常初始化
CrashHandler.getInstance().init(getApplicationContext());
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
package
com.example.android_uncatchexception;
import
java.lang.Thread.UncaughtExceptionHandler;
import
android.content.Context;
import
android.util.Log;
/**
* 自定义异常捕获类
*
* @author ZHF
*/
public
class
CrashHandler
implements
UncaughtExceptionHandler {
public
static
final
String
TAG =
"CrashHandler"
;
// 程序的Context对象
private
Context mContext;
/** 单例模式 **/
private
CrashHandler() {
}
/** 懒汉式 **/
private
static
class
CrashHolder {
static
final
CrashHandler crashHandler =
new
CrashHandler();
}
public
static
CrashHandler getInstance() {
return
CrashHolder.crashHandler;
}
public
void
init(Context context) {
mContext = context;
// 设置该CrashHandler为程序的默认处理器
Thread.setDefaultUncaughtExceptionHandler(
this
);
}
@Override
public
void
uncaughtException(Thread thread, Throwable ex) {
Log.d(TAG,
"uncaughtException--->thread"
+ thread +
" name: "
+ thread.getName() +
" id: "
+ thread.getId() +
"exception--->"
+ ex);
String
threadName = thread.getName();
if
(
"main"
.equals(threadName)) {
Log.d(TAG,
"在主线程的崩溃!"
);
}
else
{
//这里我们根据thread name来进行区别对待:可以将异常信息写入文件供以后分析
Log.d(TAG,
"在子线程中崩溃!"
);
}
android.os.Process.killProcess(android.os.Process.myPid());
//杀死该进程
System.exit(
0
);
//退出
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package
com.example.android_uncatchexception;
import
android.os.Bundle;
import
android.app.Activity;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
public
class
MainActivity
extends
Activity {
Button mBtn;
String
str;
//不要初始化,为了下面制造空指针异常
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn = (Button)
this
.findViewById(R.id.button1);
mBtn.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
//NullPointerException
System.out.println(str);
}
});
}
}
|