public class CrashHandler implements UncaughtExceptionHandler { /** * 初始化方法 */ public static void init() { Thread.setDefaultUncaughtExceptionHandler(new CrashHandler()); } @Override public void uncaughtException(Thread thread, Throwable ex) { ex.printStackTrace(); Activity activity = Environment.activity(); //獲取activity對象,能夠經過基類Activity的靜態方法獲取 if (activity != null && !(activity instanceof SplashActivity)) { //閃退打點 // XXX try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } restartApp(activity); } } public static void restartApp(Activity activity) { if (activity == null) { return; } Intent intent = new Intent(activity.getApplicationContext(), SplashActivity.class); PendingIntent restartIntent = PendingIntent.getActivity( activity.getApplicationContext(), 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK); AlarmManager mgr = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE); mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent); //殺死老線程 android.os.Process.killProcess(android.os.Process.myPid()); } }
AlarmManager,顧名思義,就是「提醒」,是Android中經常使用的一種系統級別的提示服務,在特定的時刻爲咱們廣播一個指定的Intent。簡單的說就是咱們設定一個時間,而後在該時間到來時,AlarmManager爲咱們廣播一個咱們設定的Intent,一般咱們使用 PendingIntent,PendingIntent能夠理解爲Intent的封裝包,簡單的說就是在Intent上在加個指定的動做。在使用Intent的時候,咱們還須要在執行startActivity、startService或sendBroadcast才能使Intent有用。而PendingIntent的話就是將這個動做包含在內了。java
AlarmManager經常使用於定時鬧鐘,一下是一個例子android
AlarmManager.RTC_WAKEUP休眠時會運行,若是是AlarmManager.RTC,在休眠時不會運行ide
//建立Intent對象,action爲ELITOR_CLOCK,附加信息爲字符串「你該打醬油了」 Intent intent = new Intent("ELITOR_CLOCK"); intent.putExtra("msg","你該打醬油了"); //定義一個PendingIntent對象,PendingIntent.getBroadcast包含了sendBroadcast的動做。 //也就是發送了action 爲"ELITOR_CLOCK"的intent PendingIntent pi = PendingIntent.getBroadcast(this,0,intent,0); //AlarmManager對象,注意這裏並非new一個對象,Alarmmanager爲系統級服務 AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); //設置鬧鐘從當前時間開始,每隔5s執行一次PendingIntent對象pi,注意第一個參數與第二個參數的關係 // 5秒後經過PendingIntent pi對象發送廣播 am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),5*1000,pi);
在Manifest.xml中註冊廣播接收器:函數
<receiver android:name=".MyReceiver"> <intent-filter> <action android:name="ELITOR_CLOCK" /> </intent-filter> </receiver>
重寫onReceive()函數。this
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Log.d("MyTag", "onclock......................"); String msg = intent.getStringExtra("msg"); Toast.makeText(context,msg,Toast.LENGTH_SHORT).show(); } }