Android学习之活动的最佳实践
•问题的起源
先来模拟一个场景:打开一个 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学习之活动的最佳实践的更多相关文章
- (Android第一行代码实验一)活动的最佳实践
活动的最佳实践 1.知晓当前是在哪一个活动 这个技巧将教会你,如何根据程序当前的界面就能判断出这是哪一个活动. 首先需要新建一个 BaseActivity 继承自 Activi ...
- android:活动的最佳实践
2.6.1 知晓当前是在哪一个活动 这个技巧将教会你,如何根据程序当前的界面就能判断出这是哪一个活动.可能你会觉 得挺纳闷的,我自己写的代码怎么会不知道这是哪一个活动呢?很不幸的是,在你真正进入 ...
- Android 6.0 权限管理最佳实践
博客: Android 6.0 运行时权限管理最佳实践 github: https://github.com/yanzhenjie/AndPermission
- JavaScript2谁刚开始学习应该知道4最佳实践文章(翻译)
原版的:24 JavaScript Best Practices for Beginners (注:阅读原文的时候没有注意公布日期,觉得不错就翻译了,翻译到JSON.parse那一节觉得有点不正确路才 ...
- Android 学习之活动的生命周期
•返回栈 Android 中的活动是可以叠层的: 我们每启动一个新的活动,就会覆盖在原活动之上: 然后点击 Back 键会销毁最上面的活动,下面一个活动就会重新显示出来: 其实 Android 是使用 ...
- Android中活动的最佳实践(如何很快的看懂别人的代码activity)
这种方法主要在你拿到别人的代码时候很多activity一时半会儿看不懂,用了这个方法以后就可以边实践操作就能够知道具体哪个activity是干什么用的 1.新建一个BaseActivity的类,让他继 ...
- git学习------>Git 分支管理最佳实践
ps:本文转载于 : https://www.ibm.com/developerworks/cn/java/j-lo-git-mange/index.html Git 是目前最流行的源代码管理工具.大 ...
- .NET Core学习笔记(7)——Exception最佳实践
1.为什么不要给每个方法都写try catch 为每个方法都编写try catch是错误的做法,理由如下: a.重复嵌套的try catch是无用的,多余的. 这一点非常容易理解,下面的示例代码中,O ...
- [转]Android ORM系列之GreenDao最佳实践
GreenDAO是一个可以帮助Android开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案,通过使用一个简单的面向对象API,开发者可以对Java对象进行存储.更新.删除和查 ...
随机推荐
- 从长度为 M 的无序数组中,找出N个最小的数
从长度为 M 的无序数组中,找出 N个最小的数 在一组长度为 n 的无序的数组中,取最小的 m个数(m < n), 要求时间复杂度 O(m * n) 网易有道面试题 const minTopK ...
- Dart All In One
Dart All In One dart & flutter https://github.com/dart-lang https://github.com/dart-lang/sdk win ...
- c++ string split function
#include <string> #include <vector> #include <regex> struct SplitListItem { std::s ...
- Flutter: IntrinsicWidth类,将孩子的宽度调整为孩子的最大内在宽度
文档 原文 class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePage ...
- 关于MacBook Air/Pro 外接显示器时,显示器黑屏无反应的解决方法,顺便求助M1芯片的mac 外接显示器如何开启Hidpi
显示器黑屏,无反应,频繁闪烁的原因 先说结论,直接换type-c转DP的显示器连接线吧,如果显示器不支持dp接口,那自求多福吧. 事情是这样的,m1版本的macbook air 刚发布就马上入手了一台 ...
- 在next主题添加微信公众号二维码
在侧边栏添加微信公众号二维码 首先,当然是准备一张微信公众号二维码.有两种添加方式,添加到侧边栏或者添加到推文的结尾处.我的next主题是7.x版本的,使用的主题是Gemini,设置的侧栏显示方式是一 ...
- docker镜像常用操作的基本命令
1.拉取/下载镜像 docker pull 镜像名称 (可以从网易云镜像中心获取要下载的镜像) 2.查看已经下载的镜像 docker images 3.删除本地镜像 docker rmi ...
- GetQueuedCompletionStatus客户端前端和server之间的通信
项目中遇到了这个东西,怎么都调试不到.记录下. 一.完成端口IOCP https://www.cnblogs.com/yuanchenhui/p/iocp_windows.html
- 从头捋了一遍 Java 代理机制,收获颇丰
尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 「CS-Wiki」Gitee ...
- 身份认证:JSON Web Token
JSON Web Token(JWT)是一种基于JSON的开放标准((RFC 7519),也是目前最流行的跨域认证解决方案. 传统的 cookie 认证方式看起来遵守了 REST 架构的无状态要求,但 ...