•问题的起源

  先来模拟一个场景:打开一个 App,最先映入眼帘的是主活动(MainActivity),在该活动中给用户提供了一个 Button,

  用户点击该 Button 实现由 MainActivity 跳转到 FirstActivity,在 FirstActivity 中,又提供了一个 Button,

  用户点击后,同样是实现页面跳转功能,只不过这次是从 FirstActivity 跳转到 SecondActivity;

  现在用户想回到主界面,点击 Back 键,界面由 SecondActivity 跳转到 FirstActivity,再点击一下,界面跳转到 MainActivity,

  再点击一下界面才能回到主界面,当然,直接点击 home 键也是可以的(这不是本节的重点,你就假设该用户的 home 键被扣掉了),

  那么,如何才能够实现在 SecondActivity 界面通过点击一下 Back 键,就能够返回到主界面呢?

•准备工作

  新建一个项目,至于命名的话,随便啦~~~

  新建两个活动,分别命名为 FirstActivity 和 SecondActivity;

  首先看看 SecondActivity 中的代码;

activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Second Activity"
android:textSize="20sp"
/>
</RelativeLayout>

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
}

  接下来瞅瞅 FirstActivity 中的代码;

activity_first.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="First Activity"
android:textSize="20sp"
/>
<Button
android:id="@+id/btn_first"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="跳转到 Second Activity"
android:textAllCaps="false"
/>
</RelativeLayout>

FirstActivity.java

public class FirstActivity extends AppCompatActivity {

    @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first); Button btn = findViewById(R.id.btn_first);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(FirstActivity.this,SecondActivity.class));
}
});
}
}

  最后,让我们来看看主活动中的代码;

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Main Activity"
android:textSize="20sp"
/>
<Button
android:id="@+id/btn_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="跳转到 First Activity"
android:textAllCaps="false"
/>
</RelativeLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button btn = findViewById(R.id.btn_main);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,FirstActivity.class));
}
});
}
}

运行效果

  仿照问题描述,我们来测试一下;

•知识支持

  假设父类 Person 中有一个  onCreate() 方法,子类 Boy 继承自 Person 类并重写了 onCreate() 方法;

  在子类的  onCreate() 方法中通过  super.onCreate() 语句调用了父类的  onCreate() 方法,

  那么,在这种情况下,父类的  onCreate() 方法中的 this 指向的是其子类 Boy;

public class Person {

    public void onCreate() {
System.out.println(this.toString());
} public static void main(String[] args) { Boy boy = new Boy();
boy.onCreate(); }
}
class Boy extends Person{ public void onCreate() {
super.onCreate();
}
}

  上述代码的运行效果为:

  具体用法请移步【this 关键字的使用】;

•解决需求

  新建一个 ActivityCollector 类作为活动管理器;

ActivityCollector.java

public class ActivityCollector {

    public static List<Activity> activities = new ArrayList<>();

    public static void addActivity(Activity activity){
activities.add(activity);
} public static void removeActivity(Activity activity){
activities.remove(activity);
} public static void finishAll(){
for(Activity activity : activities){
if(!activity.isFinishing()){
activity.finish();
}
}
}
}

  在该类中,通过 List 来暂存活动,并提供了  addActivity() 和  removeActivity() 方法用于向 List 中添加和移除一个活动;

  还提供了  finishAll() 方法用于将 List 中暂存的活动全部销毁;

  新建一个 BaseActivity;

BaseActivity.java

public class BaseActivity extends AppCompatActivity {

    @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
} @Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}

  在 BaseActivity 的  onCreate() 方法中调用了  ActivityCollector.addActivity(this) ,表明将当前正在创建的活动添加到 List 里;

  在  onDestroy() 方法中调用了  ActivityCollector.removeActivity(this) ,表明将一个马上要销毁的活动从 List 中移除;

  修改 MainActivity.java,FirstActivity.java,SecondActivity.java 的继承关系,使其均继承自 BaseActivity;

  还记得活动中的  onCreate()  的方法中的第一行代码是啥吗?

  没错,就是它: super.onCreate(savedInstanceState); ;

  不管是 MainActivity 还是 FirstActivity 和 SecondActivity,一定都会调用  super.onCreate(savedInstanceState); ;

  由于他们都是继承自 BaseActivity,所以,创建 MainActivity 时一定会先调用 BaseActivity 中的  onCreate() 方法;

  还记得知识支持里讲的 this 关键字的作用吗?

  在 BaseActivity 中的 onCreate() 方法中,通过 this 关键字将 MainActivity 加入到 List 中,创建按 FirstActivity 和 SecondActivity 时,同理;

  这样的话,就将开启的活动全部加入到 List 中了;

  从此以后,不管你想在什么地方退出程序,只需要调用  ActivityCollector.finishAll() 方法就可以了;

  修改 SecondActivity.java 中的代码;

SecondActivity.java

public class SecondActivity extends BaseActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
} @Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.finishAll();
}
}

运行效果

  

Android学习之活动的最佳实践的更多相关文章

  1. (Android第一行代码实验一)活动的最佳实践

    活动的最佳实践    1.知晓当前是在哪一个活动         这个技巧将教会你,如何根据程序当前的界面就能判断出这是哪一个活动.  首先需要新建一个 BaseActivity 继承自 Activi ...

  2. android:活动的最佳实践

    2.6.1    知晓当前是在哪一个活动 这个技巧将教会你,如何根据程序当前的界面就能判断出这是哪一个活动.可能你会觉 得挺纳闷的,我自己写的代码怎么会不知道这是哪一个活动呢?很不幸的是,在你真正进入 ...

  3. Android 6.0 权限管理最佳实践

    博客: Android 6.0 运行时权限管理最佳实践 github: https://github.com/yanzhenjie/AndPermission

  4. JavaScript2谁刚开始学习应该知道4最佳实践文章(翻译)

    原版的:24 JavaScript Best Practices for Beginners (注:阅读原文的时候没有注意公布日期,觉得不错就翻译了,翻译到JSON.parse那一节觉得有点不正确路才 ...

  5. Android 学习之活动的生命周期

    •返回栈 Android 中的活动是可以叠层的: 我们每启动一个新的活动,就会覆盖在原活动之上: 然后点击 Back 键会销毁最上面的活动,下面一个活动就会重新显示出来: 其实 Android 是使用 ...

  6. Android中活动的最佳实践(如何很快的看懂别人的代码activity)

    这种方法主要在你拿到别人的代码时候很多activity一时半会儿看不懂,用了这个方法以后就可以边实践操作就能够知道具体哪个activity是干什么用的 1.新建一个BaseActivity的类,让他继 ...

  7. git学习------>Git 分支管理最佳实践

    ps:本文转载于 : https://www.ibm.com/developerworks/cn/java/j-lo-git-mange/index.html Git 是目前最流行的源代码管理工具.大 ...

  8. .NET Core学习笔记(7)——Exception最佳实践

    1.为什么不要给每个方法都写try catch 为每个方法都编写try catch是错误的做法,理由如下: a.重复嵌套的try catch是无用的,多余的. 这一点非常容易理解,下面的示例代码中,O ...

  9. [转]Android ORM系列之GreenDao最佳实践

    GreenDAO是一个可以帮助Android开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案,通过使用一个简单的面向对象API,开发者可以对Java对象进行存储.更新.删除和查 ...

随机推荐

  1. PyCharm 中文 字符 python 报错 的 完美 解决方案!

    PyCharm 中文 字符 python 报错 的 完美 解决方案! #_*_ coding:utf-8_*_ https://www.python.org/dev/peps/pep-0263/ 到p ...

  2. GPU 加速 & WebGL

    GPU 加速 & WebGL 开启 GPU 加速, 硬件加速 垃圾面试官,瞎忽悠 holy shit 美国想象力英语,前端 leader WebGL 加速 ??? 是什么鬼 ??? three ...

  3. 电信悦 me 智能网关

    电信悦 me 智能网关 悦 me 智能网关 Q1:什么是电信悦 me 智能网关? 悦me网关是智慧家庭的核心终端,作为"光猫+智能路由器"的集合体, 采用了全新的硬件.外观及智能操 ...

  4. 类属性和__init__的实例属性有何区别?进来了解一下吧

    真的是随笔写的一篇,以防日后记忆模糊,特此记录.大佬勿喷 疑问:类属性和实例属性有何区别? 正题,代码如下 age为People类的属性(称为类属性) name是在__init__方法下,在创建实例对 ...

  5. django学习-27.admin管理后台里:对列表展示页面的数据展示进行相关优化

    目录结构 1.前言 2.完整的操作步骤 2.1.第一步:查看ModelAdmin类和BaseModelAdmin类的源码 2.2.第二步:查看表animal对应的列表展示页面默认的数据展示 2.3.第 ...

  6. TypeError: Object of type 'datetime' is not JSON serializable

    我的描述:我在flask框架中引用orm查数据库并返回数据,出现此类问题,如下图: 解决方案: 1.从表面意思看,就是说datetime时间类型无法被序列化.于是我百度了网上的同事的解答,大多说是时间 ...

  7. JavaScript高级:JavaScript面向对象,JavaScript内置对象,JavaScript BOM,JavaScript封装

    知识点梳理 课堂讲义 1.JavaScript面向对象 1.1.面向对象介绍 在 Java 中我们学习过面向对象,核心思想是万物皆对象. 在 JavaScript 中同样也有面向对象.思想类似. 1. ...

  8. Redis高频面试题总结

    通过面试多家大型互联网企业,总结了如下的高频面试题目: 1.redis 过期键的删除策略? (1)定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键的过期时间来临时,立即 ...

  9. Jquery获取链接请求的参数

    比如有一个链接:https://www.baidu.com/s?cl=3&tn=baidutop10&fr=top1000,先定义方法: //获取url中的参数 function ge ...

  10. rar密码破解工具汇总

    rar密码破解工具汇总 前言 假如酷爱在网络上找各种资源的你,经历千辛万苦终于找到了一个rar打包的文件,兴奋地慌忙点击,可打开才发现是加密的,相信这样的场景很多人都遇到过,今天就针对压缩文件密码的破 ...