
關(guān)于
好久沒有更新文章了,感覺該寫點什么了。就簡單點的啦,這次分享一個Activity管理工具,輕松關(guān)閉想關(guān)閉的頁面。寫這個的原因也是因為,在當(dāng)前頁面需要關(guān)閉上一個頁面或其他之前打開的頁面。其實網(wǎng)上也有很多的辦法,比如static修飾,比如Application、隊列管理等等,感比較麻煩,不注意容易內(nèi)存泄漏。所以自己搞了一個管理類,只需要在Application中的onCreate方法中初始化一次,就OK了,剩下的就是你要關(guān)哪個頁面了。
演示
還是先來個GIF圖演示一下吧

操作
- 初始化
自定義Application,在onCreate中添加XActivityManager.addActivityListener(this);
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
XActivityManager.addActivityListener(this);
}
}
- 怎么用?
假如說當(dāng)前有Activity:MainActivity、OneActivity、TwoActivity、ThreeActivity、FourActivity、FiveActivity
- 當(dāng)你在
ThreeActivity關(guān)閉TwoActivity:
XActivityManager.getInstance().finishActivityByName(TwoActivity.class);
- 當(dāng)你在
FourActivity想關(guān)閉所有Activity排除MainActivity
XActivityManager.getInstance().finishAllExceptThisActivity(MainActivity.class);
實現(xiàn)思路
代碼在下面大家可以先看一看
- 代碼的主要思路在于添加了關(guān)于Application對Activity的監(jiān)聽,當(dāng)監(jiān)聽到有Activity運行是則添加到Map中,如果Activity銷毀則從Map中刪除。
- 用Map管理,是方便與通過名字就可以finish掉Activity。
- 由于可能造成內(nèi)存泄漏,Map添加的是含有Activity的WeakReference。
- 通過方法傳入Activity的class,然后獲取Activity名字,通過Map的key得到Activity。
代碼
import android.app.Activity;
import android.app.Application;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;
public class XActivityManager {
private static XActivityManager sInstance = new XActivityManager();
private WeakReference<Activity> sCurrentActivityWeakRef;
private Map<String, WeakReference<Activity>> mAllActivity;
private XActivityManager() {
mAllActivity = new HashMap<>();
}
public static XActivityManager getInstance() {
return sInstance;
}
/**
* 獲取當(dāng)前Activity
* @return
*/
public Activity getCurrentActivity() {
Activity currentActivity = null;
if (sCurrentActivityWeakRef != null) {
currentActivity = sCurrentActivityWeakRef.get();
}
return currentActivity;
}
private void setCurrentActivity(Activity activity) {
sCurrentActivityWeakRef = new WeakReference<>(activity);
mAllActivity.put(activity.getClass().getSimpleName(), sCurrentActivityWeakRef);
for (Map.Entry<String, WeakReference<Activity>> entry :
mAllActivity.entrySet()) {
WeakReference<Activity> wr = entry.getValue();
if (wr.get() == null) continue;
Log.i("XActivityManager", "當(dāng)前活動Activity:" + wr.get().getClass().getSimpleName());
}
Log.i("XActivityManager", "---------------------------------------");
}
private void removeThisActivity(Activity activity) {
mAllActivity.remove(activity.getClass().getSimpleName());
}
/**
* 通過Activity 名字干掉這個Activity
*
* @param activityClass
*/
public void finishActivityByName(Class<? extends Activity> activityClass) {
WeakReference<Activity> wr = mAllActivity.get(activityClass.getSimpleName());
if (wr == null) return;
Activity activity = wr.get();
if (
activity == null
|| activity.isFinishing()
|| (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed())
)
return;
activity.finish();
}
/**
* 干掉所有的activity排除這個Activity
*/
public void finishAllExceptThisActivity(Class<? extends Activity> activityClass) {
for (Map.Entry<String, WeakReference<Activity>> entry :
mAllActivity.entrySet()) {
WeakReference<Activity> wr = entry.getValue();
if (
wr.get() == null
|| wr.get().isFinishing()
|| (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && wr.get().isDestroyed())
|| entry.getKey().equals(activityClass.getSimpleName())
)
continue;
wr.get().finish();
}
}
/**
* 添加對Activity的監(jiān)聽
*/
public static void addActivityListener(Application app) {
app.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
XActivityManager.getInstance().setCurrentActivity(activity);
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
XActivityManager.getInstance().removeThisActivity(activity);
}
});
}
}
END