}
super.onDestroy();
}
}
发送广播就需要在各个需求子Activity中进行了,这里使用工具类,方便以后多次或者拓展使用,只需要在需求子Activity中直接调用就行。
public class BroadcastUtils {
/**
- 发送finish页面的广播
- action可以自己根据需要添加
- @param context
*/
public static void sendFinishActivityBroadcast(Context context) {
Intent intent = new Intent(BaseActivity.RECEIVER_ACTION_FINISH_B);
context.sendBroadcast(intent);
intent = new Intent(BaseActivity.RECEIVER_ACTION_FINISH_C);
context.sendBroadcast(intent);
}
}
####优劣:
优点:最常规使用,不会出现内存泄漏,在基类中操作,代码量不多。
缺点:项目中若是需要关闭页面多的话,需要发送大量广播,会降低性能。
##方案二
####直接static activity方式
这是网上提供的,代码一看就明显的内存泄漏。但是。。。。。。
private static AActivity sInstance;
public static AActivity getInstance() {
if (sInstance != null) {
return sInstance;
}
return null;
}
public static void finishActivity() {
if (sInstance != null) {
sInstance.finish();
}
}
内存泄漏明显,之所以有但是,那是因为这种方式让我想到加入弱引用WeakReference的方式。
public class BActivity extends BaseActivity {
private static WeakReference sActivityRef;
public static void finishActivity() {
if (sActivityRef != null && sActivityRef.get() != null) {
sActivityRef.get().finish();
}
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
sActivityRef = new WeakReference<>(this);
Button btnB = (Button) findViewById(R.id.btn_b);
btnB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(BActivity.this, CActivity.class));
}
});
}
}
WeakReference以及JVM相关,虽然WeakReference被static了,生命周期变长了,但是WeakReference关联的对象不受影响的,依然遵循WeakReference在gc时候的规则。
优劣: 优点:代码简单直观,引入WeakReference,解决了内存泄漏问题。 缺点:在每个activity中都要添加,代码量多。(不知是否可抽取到基类中,以后尝试)
##方案三
####使用集合或者栈的方式
public class FinishActivityManager {
private FinishActivityManager() {
}
private static FinishActivityManager sManager;
private List activityList;
public static FinishActivityManager getManager() {
if (sManager == null) {
synchronized (FinishActivityManager.class) {
if (sManager == null) {
sManager = new FinishActivityManager();
}
}
}
return sManager;
}
/**
- 添加Activity到集合中
/
public void addActivity(Activity activity) {
if (activityList == null) {
activityList = new LinkedList<>();
}
activityList.add(activity);
}
/* - 关闭指定的Activity
/
public void finishActivity(Activity activity) {
if (activityList != null && activity != null && activityList.contains(activity)) {
//使用迭代器安全删除
for (Iterator it = activityList.iterator(); it.hasNext(); ) {
Activity temp = it.next();
// 清理掉已经释放的activity
if (temp == null) {
it.remove();
continue;
}
if (temp == activity) {
it.remove();
}
}
activity.finish();
}
}
/* - 关闭指定类名的Activity
/
public void finishActivity(Class<?> cls) {
if (activityList != null) {
// 使用迭代器安全删除
for (Iterator it = activityList.iterator(); it.hasNext(); ) {
Activity activity = it.next();
// 清理掉已经释放的activity
if (activity == null) {
it.remove();
continue;
}
if (activity.getClass().equals(cls)) {
it.remove();
activity.finish();
}
}
}
}
/* - 关闭所有的Activity
/
public void finishAllActivity() {
if (activityList != null) {
for (Iterator it = activityList.iterator(); it.hasNext(); ) {
Activity activity = it.next();
if (activity != null) {
activity.finish();
}
}
activityList.clear();
}
}
/* - 退出应用程序
*/
public void exitApp() {
try {
finishAllActivity();
// 退出JVM,释放所占内存资源,0表示正常退出
System.exit(0);
// 从系统中kill掉应用程序
android.os.Process.killProcess(android.os.Process.myPid());
} catch (Exception e) {
e.printStackTrace();
}
}
}
这种方式注意在删除的时候使用迭代器,否则会出现并发修改异常。 那就来说说但是,应用中要是不使用这种封装的方式去finish掉Activity的时候,封装的manager并不知道,没有断开并释放掉其引用,会引起内存泄漏。所以WeakReference又要出场了。
public class FinishActivityManager {
private FinishActivityManager() {
}
private static FinishActivityManager sManager;
private Stack<WeakReference> mActivityStack;
public static FinishActivityManager getManager() {
if (sManager == null) {
synchronized (FinishActivityManager.class) {
if (sManager == null) {
sManager = new FinishActivityManager();
}
}
}
return sManager;
}
/**
- 添加Activity到栈
- @param activity
/
public void addActivity(Activity activity) {
if (mActivityStack == null) {
mActivityStack = new Stack<>();
}
mActivityStack.add(new WeakReference<>(activity));
}
/* - 检查弱引用是否释放,若释放,则从栈中清理掉该元素
/
public void checkWeakReference() {
if (mActivityStack != null) {
// 使用迭代器进行安全删除
for (Iterator<WeakReference> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference activityReference = it.next();
Activity temp = activityReference.get();
if (temp == null) {
it.remove();
}
}
}
}
/* - 获取当前Activity(栈中最后一个压入的)
- @return
/
public Activity currentActivity() {
checkWeakReference();
if (mActivityStack != null && !mActivityStack.isEmpty()) {
return mActivityStack.lastElement().get();
}
return null;
}
/* - 关闭当前Activity(栈中最后一个压入的)
/
public void finishActivity() {
Activity activity = currentActivity();
if (activity !=
null) {
finishActivity(activity);
}
}
/* - 关闭指定的Activity
- @param activity
/
public void finishActivity(Activity activity) {
if (activity != null && mActivityStack != null) {
// 使用迭代器进行安全删除
for (Iterator<WeakReference> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference activityReference = it.next();
Activity temp = activityReference.get();
// 清理掉已经释放的activity
if (temp == null) {
it.remove();
continue;
}
if (temp == activity) {
it.remove();
}
}
activity.finish();
}
}
/* - 关闭指定类名的所有Activity
- @param cls
/
public void finishActivity(Class<?> cls) {
if (mActivityStack != null) {
// 使用迭代器进行安全删除
for (Iterator<WeakReference> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference activityReference = it.next();
Activity activity = activityReference.get();
// 清理掉已经释放的activity
if (activity == null) {
it.remove();
continue;
}
if (activity.getClass().equals(cls)) {
it.remove();
activity.finish();
}
}
}
}
/* - 结束所有Activity
*/
public void finishAllActivity() {
if (mActivityStack != null) {
for (WeakReference activityReference : mActivityStack) {
Activity activity = activityReference.get();
if (activity != null) {
activity.finish();
}
最后
小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
资料⬅专栏获取
年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助**。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-m9A3kWeK-1719081252856)]一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
资料⬅专栏获取