第一章 开启安卓之路
前言
本文是基于《第一行代码》整理成的笔记,mark下自己的学习路程。
本章将通过实验着重介绍ACtivity。
项目结构
首先我们创建一个安卓项目,来认识一下项目结构;
assets //主要可以存放一些随程序打包的文件,不需要过多关注
bin //里面会有程序的apk,拷贝到手机就可以安装了
gen //该目录自动生成,例如 R.java ,不要轻易修改
libs //第三方jar包
src //源代码
res //重点{drawable //图片layout //布局文件xmlvalues //字符串AndroidManifest.xml //整个项目的配置文件,在程序定义的四大组件都要在此注册project.properties //指定程序所使用的SDK版本}
四大组件之首——Activity
Activity 就是我们所看到的界面,新建一个类,继承Activity,重写onCreate方法即可创建Activity;
每新建一个活动,都需要在 AndroidManifest.xml 注册;public class MainActivity extends Activity {@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); //加载布局文件 } }
活动的生命周期
需要注意的是,在上图中,发生 onPause() 和 onStop() 这一行为是有所区别的;
当当前的Activity部分被遮挡住时,只会调用 onPause();只有完全遮挡才会调用 onStop() ;实验理解
新建MainActivity和SecondActivity,为它们的设置一个按钮用来彼此跳转,查看它们的状态;
// MainActivity public class MainActivity extends BaseActivity {static String TAG="MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG, "onCreate");setContentView(R.layout.activity_main);Button btn1 = (Button) findViewById(R.id.btn1);btn1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {SecondActivity.actionStart(MainActivity.this);}});}public static void actionStart(Context context) {Intent intent = new Intent(context,MainActivity.class);context.startActivity(intent);}@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy");}@Overrideprotected void onPause() {super.onPause();Log.d(TAG, "onPause");}@Overrideprotected void onRestart() {super.onRestart();Log.d(TAG, "onRestart");}@Overrideprotected void onResume() {super.onResume();Log.d(TAG, "onResume");}@Overrideprotected void onStart() {super.onStart();Log.d(TAG, "onStart");}@Overrideprotected void onStop() {super.onStop();Log.d(TAG, "onStop");} }
//SecondActivity public class SecondActivity extends BaseActivity {static String TAG="SecondActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG, "onCreate");setContentView(R.layout.activity_second);Button btn2 = (Button) findViewById(R.id.btn2);btn2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {MainActivity.actionStart(SecondActivity.this);}});}public static void actionStart(Context context) {Intent intent = new Intent(context,SecondActivity.class);context.startActivity(intent);}@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy");}@Overrideprotected void onPause() {super.onPause();Log.d(TAG, "onPause");}@Overrideprotected void onRestart() {super.onRestart();Log.d(TAG, "onRestart");}@Overrideprotected void onResume() {super.onResume();Log.d(TAG, "onResume");}@Overrideprotected void onStart() {super.onStart();Log.d(TAG, "onStart");}@Overrideprotected void onStop() {super.onStop();Log.d(TAG, "onStop");} }
启动项目,默认首页是MainActivity;
我们可以看到,实例化Activity的步骤:onCreate -> onStart -> onResume ;让我们点击下按钮 “跳转到SecondActivity”;
此时SecondActivity完全将MainActivity遮蔽,所以,MainActivity会调用onStop方法;
再点下按钮 “跳转到MainActivity”;
我们看到,MainActivity调用onRestart ,而SecondActivity由于已经完成任务,所以调用销毁方法;
活动的启动模式
<!-- 在 AndroidManifest.xml中指定模式即可改变 --> <activity android:launchMode="singleTop" <!-- 有四个模式可选 -->android:name="com.example.hello.MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter> </activity>
- standard
顾名思义,就是标准的意思,也就是活动的默认模式;在standard模式下,每启动一个新的活动,它就会入栈,并且处于栈顶位置;对于该模式的活动系统不会在乎该活动是否已在栈中存在,就算它处于栈顶也一样,每次启动都会创建一个新的实例。
- singleTop
在某些情况下,standard模式并不合理;例如,活动明明处于栈顶,为什么还要新建实例?
所以聪明的设计者开发了singleTop模式,意思就是,当即将新建的Activity处于栈顶时,系统将直接调用,而不会新建;
- singleTask
使用singleTop模式可以很好地解决重复创建栈顶活动的问题,如果活动没有处于栈顶,singleTop就无法满足需求了,它还是会新建实例,这时候就要 singleTask 登场了;它的意思就是,只要栈中存在即将新建的活动,系统都不会生成,而是重新将其调回栈顶位置;
- singleInstance
不同于以上三种模式,singleInstance 模式下的活动会启用一个新的返回栈来管理这个活动;
我们来构建下场景,新建三个活动 A、B、C;其中 B 采用 singleInstance ,其他两个采用 singleTask ,我们分别为每个活动设置一个按钮,用来页面的跳转,按下 A 来到 B,按下 B 来到 C ,如果在 C 我们按下返回键会怎么样?没错,意外的是,它直接跳转到 A ,这又该如何理解?
其实原理很简单,我们看到下图,其实A和B是处于同一个栈,所以结束C自然会跳转到A,当结束A时,此时左边栈就空了,自然会返回B;
活动实践
下面将介绍几种活动运用的小技巧;
知晓当前处于哪个活动
对于我们自己写的项目,我们当然能快速判断这是哪个活动,但如果是别人写的项目就很麻烦了;
我们新建一个名为 BaseActivity 继承自 Activity ,然后重写 onCreate() 方法,如下:public class BaseActivity extends Activity {@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d("BaseActivity", getClass().getSimpleName()); } }
最后只需要将其他类改成继承自 BaseActivity 即可。
随时随地退出程序
思路其实就是,建立一个专门用来管理所有活动的类——ManagerActivity;
//代码 public class ManagerActivity extends Activity {public static List<Activity> activities = new ArrayList<Activity>(); 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();}} } }
我们还可以将在BaseActivity中调用ManagerActivity,这样我们只需调用 finishAll() 就可以随时随地退出程序;
public class BaseActivity extends Activity {@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d("LocationActivity", getClass().getSimpleName());ManagerActivity.addActivity(this); }@Override protected void onDestroy() {super.onDestroy();ManagerActivity.removeActivity(this); } }
启动活动的最佳方法
如果我们要从 FirstActivity 传递两个参数到 SecondActivity ,我们可以这么写:
Intent intent = new Intent(FirstActivity.this,SecondActivity.class); intent.putExtra("param1", "data1"); intent.putExtra("param2", "data2"); startActivity(intent);
这当然可以,但如果 SecondActivity 不是你开发的呢?而你又有需要调用启动 SecondActivity ,又该怎么解决?其实我们可以为 SecondActivity 写一个启动方法,这样其他人就一目了然了。
public class SecondActivity extends BaseActivity {public static void actionStart(Context context,String data1,String data2) {Intent intent = new Intent(context,SecondActivity.class);intent.putExtra("param1", "data1");intent.putExtra("param2", "data2");context.startActivity(intent);} }
这样,别人只需要调用方法actionStart,填上参数就可以轻松启动。
第一章 开启安卓之路相关推荐
- java执行aapt_第一章:在安卓上运行aapt
引言:三百六十行,行行出状元! 0 q- q- @6 D9 Y5 u- M, o& H3 X大家好啊,我是CeePear # O& r0 `! a, M& k5 J* @7 l ...
- python 数据挖掘 简书_[Python数据挖掘入门与实践]-第一章开启数据挖掘之旅
1.数据挖掘简介(略) 2.使用Python和IPython Notebook 2.1.安装Python 2.2.安装IPython 2.3.安装scikit-learn scikit-learn是用 ...
- 第一章 开启网络安全态势感知的旅程
1.1 引言 网络安全态势感知本质上就是获取并理解大量网络安全数据,判断当前整体安全状态并预测短期未来趋势.总体而言,分为三个阶段:态势提取.态势理解和态势预测. 1.2 网络安全监视 1.2.1 计 ...
- 《学习之道》第一章开启大门-数学和语言
这一切的根源就是在数学上的困扰.我曾经把数字.方程之类的东西视若洪水猛兽,唯恐避之不及.那时我不知道,本有一些简单的思维小技巧可以让数学走进我的视野.这些小技巧不仅对数学差的人有所帮助,数理优等生也同 ...
- 安卓移动开发-第一章
安卓移动开发-第一章 1.安卓基础入门 1.1安卓体系结构 1.2Dalvik虚拟机 1.3安卓开发环境搭建 开发第一个安卓程序--HelloWorld 1.4安卓程序/项目结构 1.4.1新建mod ...
- 《从0到1:CTFer成长之路》 [第一章 web入门] 常见的搜集
<从0到1:CTFer成长之路> [第一章 web入门] 常见的搜集 启动环境: 提示为敏感文件,首先对网站目录进行扫描: 得到如上页面,首先访问robots.txt页面: 得到flag1 ...
- Cyclone V SoC FPGA学习之路第一章:综述
Cyclone V SoC FPGA学习之路第一章:总体了解 关键词: adaptive logic modules – ALM 自适应逻辑模块 logic array block --LAB 逻辑阵 ...
- 【系统分析师之路】第一章 计算机组成与体系结构
[系统分析师之路]第一章 计算机组成与体系结构 主要考察的内容有:Flynn分类法,CISC与RISC,流水线技术,存储系统,校验码,并行处理. CISC与RISC 指令系统类型 指令特点 寻址方式 ...
- 《从0到1:CTFer成长之路》书籍配套题目-[第一章 web入门]SQL注入-2
[第一章 web入门]SQL注入-2 一.信息收集 1.首页 2.登录成功会跳转到 3.进行测试判断 二.尝试破解 1.用post型的sqlmap破解 <1>.首先,开burp截包 < ...
最新文章
- Metasploit发布了新版本5.0.83
- bash 的相关配置
- hive 导出json格式 文件_hive支持json格式的数据
- IGDB|2021年大学生夏令营开始报名啦!
- python 图片转字符画
- linux telnet无法连接,奇怪的问题:telnet无法连接另一台server的正常的开放端口
- java day08【String类、static关键字、Arrays类、 Math类】
- android查看native日志,Android 日志管理框架 NativeLogger
- java udp 接收16进制_java UDP通信中十六进制的接收与发送
- 2016--MatConvNet Convolutional Neural Networks for MATLAB
- 应用交付学习笔记三-BIG-IP LTM健康检查
- 如果我恨一个人,我就领他到中关村买相机。
- DHCP服务器配置windows2016
- PCI GXL学习之再造篇
- linux开机自启动的几种方法
- VR全景拍摄时必须注意的事项有哪些
- 光纤专线与普通宽带区别(ASDL)
- 海南企业成功研发我国第三代防伪技术
- 计算机考神经科学,科学网—神经科学杂谈6:电脑和人脑的最大不同--计算和记忆 - 吴景鹏的博文...
- 【爱贝观察】移动支付风向转变:拓宽海外市场、渗透三四线城市
热门文章
- 【秃头系列】-【本科生毕设论文格式Word】小修改和小问题
- 网易考试大题知识盲区之B树、B+树、B*树
- 力扣——883. 三维形体投影面积(Java、JavaScript、C实现)
- Android Rom修改制作工具软件集合
- 小游戏策划案例精选_趣味小游戏活动方案_趣味游戏活动策划书
- 禁止Ubuntu快捷键(二)
- Echarts3.0引入百度地图-简单说
- 平台“运营+变现”万精油方法论:拉新→促活→留存→转化→裂变→提频
- 现在学习软件测试好找工作吗
- 阅文集团面经(PHP后端开发实习)