編輯:關於Android編程
這裡介紹兩種方法:一種把每個activity記住,然後逐一干掉;另一種思路是使用廣播。
具體代碼如下:
import java.util.LinkedList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Application;
import android.content.DialogInterface;
import android.content.Intent;
/**
* @author liuyazhuang
*/
public class SysApplication extends Application {
private List mList = new LinkedList();
private static SysApplication instance;
private SysApplication() {}
public synchronized static SysApplication getInstance() {
if (null == instance) {
instance = new SysApplication();
}
return instance;
}
// add Activity
public void addActivity(Activity activity) {
mList.add(activity);
}
public void exit() {
try {
for (Activity activity : mList) {
if (activity != null)
activity.finish();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
System.exit(0);
}
}
@Override
public void onLowMemory() {
super.onLowMemory();
System.gc();
}
}
在每個Activity的onCreate方法中添加類似代碼:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SysApplication.getInstance().addActivity(this);
}
在需要退出程序的時候,調用:SysApplication.getInstance().exit();簡而言之,通過單例模式把每個Activity 的引用添加到一個全局鏈表中,每次退出程序調用System.exit(0)時,先調用鏈表中Activity 的finish方法
package com.lyz.android.utils;
import java.util.HashMap;
import java.util.Set;
import android.app.Activity;
/**
* 一個Activity管理器管理活動的Activity。
* @author liuyazhuang
* Date:2015-08-17
*/
public class ActivityTaskManager {
private static ActivityTaskManager activityTaskManager = null;
private HashMap activityMap = null;
private ActivityTaskManager() {
activityMap = new HashMap();
}
/**
* 返回activity管理器的唯一實例對象。
*
* @return
*/
public static synchronized ActivityTaskManager getInstance() {
if (activityTaskManager == null) {
activityTaskManager = new ActivityTaskManager();
}
return activityTaskManager;
}
/**
* 將一個activity添加到管理器。
*
* @param activity
*/
public Activity putActivity(String name, Activity activity) {
return activityMap.put(name, activity);
}
/**
* 得到保存在管理器中的Activity對象。
*
* @param name
* @return
*/
public Activity getActivity(String name) {
return activityMap.get(name);
}
/**
* 返回管理器的Activity是否為空。
*
* @return 當且當管理器中的Activity對象為空時返回true,否則返回false。
*/
public boolean isEmpty() {
return activityMap.isEmpty();
}
/**
* 返回管理器中Activity對象的個數。
*
* @return 管理器中Activity對象的個數。
*/
public int size() {
return activityMap.size();
}
/**
* 返回管理器中是否包含指定的名字。
*
* @param name
* 要查找的名字。
* @return 當且僅當包含指定的名字時返回true, 否則返回false。
*/
public boolean containsName(String name) {
return activityMap.containsKey(name);
}
/**
* 返回管理器中是否包含指定的Activity。
*
* @param activity
* 要查找的Activity。
* @return 當且僅當包含指定的Activity對象時返回true, 否則返回false。
*/
public boolean containsActivity(Activity activity) {
return activityMap.containsValue(activity);
}
/**
* 關閉所有活動的Activity。
*/
public void closeAllActivity() {
Set activityNames = activityMap.keySet();
for (String string : activityNames) {
finisActivity(activityMap.get(string));
}
activityMap.clear();
}
/**
* 關閉所有活動的Activity除了指定的一個之外。
*
* @param nameSpecified
* 指定的不關閉的Activity對象的名字。
*/
public void closeAllActivityExceptOne(String nameSpecified) {
Set activityNames = activityMap.keySet();
Activity activitySpecified = activityMap.get(nameSpecified);
for (String name : activityNames) {
if (name.equals(nameSpecified)) {
continue;
}
finisActivity(activityMap.get(name));
}
activityMap.clear();
activityMap.put(nameSpecified, activitySpecified);
}
/**
* 移除Activity對象,如果它未結束則結束它。
*
* @param name
* Activity對象的名字。
*/
public void removeActivity(String name) {
Activity activity = activityMap.remove(name);
finisActivity(activity);
}
private final void finisActivity(Activity activity) {
if (activity != null) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}
2.2退出整個應用難免讓人困擾,曾經一度的嘗試一下方式:
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); manager.killBackgroundProcesses(package);不行
android.os.Process.killProcess(android.os.Process.myPid());也不行
manager.restartPackage(package);還是不行
Intent MyIntent = new Intent(Intent.ACTION_MAIN); MyIntent.addCategory(Intent.CATEGORY_HOME); startActivity(MyIntent); finish();這個只是退回到桌面,如果打開多個Activity關閉重新打開也會有問題,還是還是不行
看到有說廣播機制,發現是個好東東,能徹底解決這個問題,廢話不說看代碼:
public abstract class EnterActivity extends BaseActivity {
...
// 寫一個廣播的內部類,當收到動作時,結束activity
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
unregisterReceiver(this); // 這句話必須要寫要不會報錯,不寫雖然能關閉,會報一堆錯
((Activity) context).finish();
}
};
@Override
public void onResume() {
super.onResume();
// 在當前的activity中注冊廣播
IntentFilter filter = new IntentFilter();
filter.addAction(Attribute.PAGENAME);
registerReceiver(this.broadcastReceiver, filter); // 注冊
}
public void close() {
Intent intent = new Intent();
intent.setAction(Attribute.PAGENAME); // 說明動作
sendBroadcast(intent);// 該函數用於發送廣播
finish();
}
...
}
別人寫的缺了個地方(unregisterReceiver)這個必須要加,不然會出一堆錯,找了個最簡單的方法。
Android使用Fragment打造萬能頁面切換框架
首先我們來回憶一下傳統用Activity進行的頁面切換,activity之間切換,首先需要新建intent對象,給該對象設置一些必須的參數,然後調用startActivi
android---粒子雨效果的實現
剛學習了自定義view,就按照極客學院的教程做了粒子雨效果,主要用到繪畫線條和多線程,其中的抽象類設計方法值得學習,1.baseview主要是設定雨滴要實現的動作,只是先
Android調試出現The selected device is incompatible問題解決
Android調試出現The selected device is incompatible問題解決在做Android調試時碰到該問題。詳情如下圖所示:總結了一下碰到該問
圖文詳解Android Studio搭建Android集成開發環境的過程
有很長一段時間沒有更新博客了,最近實在是太忙了,沒有時間去總結,現在終於可以有時間去總結一些Android上面的東西了,很久以前寫過這篇關於使用Android Studi