当前位置: 首页 > news >正文

探究adroid活动

Intent用处

隐式使用intent,在被启动的activity的manifest文件配置该活动 
在出发活动建立intent时就写好和

网页浏览器用new intent 时用Intent.ACTION_VIEW
其在activity的manifest文件下的intent filter值为android.intent.action.VIEW

1
2
3
Intent intent = new Intent(Intent.ACTION_VIEW);//设置action
intent.setData(Uri.parse("http://www.baidu.com"));//将网址解析成一个Uri对象
startActivity(intent)//该方法会自动加上category为默认的android.intent.category.DEFAULT

 

调用系统内置的拨号界面,new intent 时使用Intent.ACTION_DIAL
其值为android.intent.action.

退出一个活动回传数据

在一个活动中使用startActivityForResult(intent,requestcode),在被启动的Activity中setResult(resultcode,intent )

当界面finish或者back时,会回调启动方activity的onActivityResult(requestcode,resultcode ,Intent data)方法

这个requestcode是启动方activity,在启动其他activity时,所用到的请求码,用于标识是哪个活动回调了这个方法,resultcode是被调用活动返回的结果码,通常RESULT_OK/RESULT_CANCEL

Intent data即为被调用活动 返回的intent

data.getStringExtra(”键”)

intent.putExtra(“键”,“键值”)

在覆写onBackPressed 去掉 ,能起到应该要有的输出的效果
super.onBackPressed();

活动的生命周期

1. 活动生命周期分类:

完整生存期:onCreate<->onDestroy
可见生存期:onStart<->onStop
前台生存期:onResume<->onPause
出现rendering problems时,可更改主题或降低android版本,均可在在手机preview上方更改

2. 对话框活动和普通活动区别

  • 当从A活动跳转到B活动,A活动会执行onPause->onStop,如果此时返回A,A活动执行onRestart->onStart->onResume
  • 如果从A活动跳转到对话框类型的B活动,A活动只会执行onPause,返回时执行onResume

在活动完全不可见(这里的可见与否,指的是用户还能不能看到.当B活动覆盖A活动时,A活动那个就不可见了.而A活动弹出对话框B,A活动依旧可见,就只会执行onPause())的时候执行onStop()

要将一个活动注册为对话框格式,只需在manifest文件下对活动进行注册
<activity android:name=".DialogActivity" android:theme="@android:style/Theme.Dialog"></activity>

3. 活动在意外情况下被回收后,返回该活动,该如何保存原有的数据?

如果A活动跳转到B活动,A活动会onPause->onStop,这时候系统如果内存不足,A活动就会被回收,若此时从B活动退回A活动,就不会再执行A活动的onStart(因为活动已被回收),现在执行onCreate,新建活动,为了能呈现活动被回收前的的状态/数据,Activity里面有个method–onSaveInstanceState(Bundle outstate),这个方法能保证在活动被回收前将数据/状态存储在outstate这个Bundle中,待到该活动被回收后,重新onCreate(Bundle savedInstanceState),savedInstanceState就不再为null,而是outstate这个bundle,所以在onCreate(Bundle savedInstanceState)函数中加入判断savedInstanceState是否为空可
预防活动在系统内存不够时被回收,而返回该活动后原有的数据不在的情况

4. 总结下,Intent传入数据和取用数据的方法:

Intent intent = new Intent();
intent.putExtra(“键”,”键值”);
intent.getStringExtra(”键”);
Bundle传入数据和取用数据的方法:
Bundle bundle = new Bundle();
bundle.putString(“键”,”键值”);
bundle.getString(“键”);

活动的状态:

1. standard

可在Manifest文件下配置活动的启动模式,默认的是standard,每次启动都会产生创建一个新的实例

2. singleTop

如果发现返回栈的栈顶已经是该活动,就不会再创建新的活动实例。若从A跳转到B活动,此时B活动位于栈顶,若此时再按下按钮到A活动,A活动会被创建新的实例,因为A不在栈顶

3. singleTask

从A活动跳转到B活动,再从B跳转到A,系统首先检查返回栈,如果有该活动,其上所有活动全出栈.需要特别注意的是,在B->A过程实地运行时,过程:是A先restart,后B onDestroy

是通过直接出栈其上活动来重启该活动

4. singleInstance

在一个应用程序中,如果某个活动启动模式是singleInstance,该活动会单独存在于一个返回栈(getTaskId()可用于该活动存在的返回栈编号),该活动也可被其他应用程序使用,
应用程序中其他活动同属于一个返回栈

例:A(返回栈1)->B(返回栈2)->C(返回栈1)
点击Back键返回A活动,再Back,到B活动,返回栈1空,再Back,返回栈2空,即退出程序

关于活动的几个小窍门:

1. 接手一个项目,不知道界面对应的活动是哪一个,方法:

新建一个class让他继承自Activity,无需再Manifest文件中注册
让其余活动继承自该class。这些活动间接继承自Activity,依旧拥有Activity的功能
只是每个活动onCreate(),都会去执行父类的onCreate函数,进而打印出该活动的类名

2. 随时随地退出程序:

注意:按下home键,活动会执行oonPause->onStop,因为活动都完全不可见了,这叫做程序被挂起

建立一个集合类ActivityCollector(),对所有的活动进行管理,这里面所有方法和实例变量均采用public static,其他类可直接引用

通过建立一个继承自Activity的基类,再让其他的三个活动继承自该基类,在该基类的onCreate()函数代码如下:

1
2
3
4
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
}

 

那么每一个活动的onCreate()函数均执行其父类的onCreate()函数

1
2
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

 

在每个活动创建过程中,均会被集合类ActivityCollector()给收入其activities集合中,附上ActivityCollector的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//ActivityCollector集合类的代码
public class ActivityCollector {
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();
}
}
}
}

 

同理:在每个活动即将被销毁,执行该活动的onDestroy(),

1
2
protected void onDestroy() {
super.onDestroy();

 

即会调用父类的onDestroy()如下:

1
2
3
4
5
//父类的onDestroy
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}

 

将此活动从Collector中移除

注意:List中存放的是活动的引用,可直接调用finish()方法,结束该活动

1
2
3
//需要注意的语法
public static List<Activity> activities = new ArrayList<Activity>();
for(Activity activity:activities)

 

我的理解:

class FirstActivity extends Activity表明了这是一种继承自Activity的类,返回栈里的一个个活动相当于是对象。对继承自Activity的类在Manifest里面注册该种活动类应该以怎样的LaunchMode启动。

注意事项

Gradle build finished with 1 error(s) in 9s 110ms
出现这样的错误,通常可能是模拟器开着同样的活动,退出活动,重新运行

要注意setOnclickListener的格式(括号分号)

android studio不稳定,遇到android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.gaby.activitylifecycletest/com.example.gaby.activitylifecycletest.NormalActivity}; have you declared this activity in your AndroidManifest.xml?
提示在manifest文件下找不到活动,如果确认程序无误,重新run一次就好

在一个类中新建一个常量
private static final String TAG = “MAINACTIVITY”

关于活动的几点沉思:

    • 当我们点击A活动的Back键,活动就执行onDestroy(onDestroy是在活动被销毁之前调用),执行后活动状态变为销毁状态
    • 只要按了Back键,虽然打开后台还有那个app,可是这时候启动这个activity又得onCreate(),因为在按下Back键后,活动已执行onDestroy,状态变为销毁状态(系统倾向于回收)
    • 点击Back键的过程是让栈顶活动出栈的过程,每个活动都会执行onPause->onStop->onDestroy

转载于:https://www.cnblogs.com/gabygoole/p/5299840.html

相关文章:

  • animation中的steps()逐帧动画
  • asm goto与JUMP_LABEL
  • 巧用工具制作视频截图索引文件
  • 进程遍历模块遍历
  • Linux inode耗尽导致图片/文件无法上传
  • 人生好比挤地铁(地铁育新站)
  • PowerDesinger12.5破解中文版-资源共享与安装介绍
  • FZU 1343 WERTYU --- 水题
  • 困惑:关于angular backbone react
  • 微软资深软件工程师:阅读代码真的很难
  • JavaScript数据格式验证探讨
  • 一步一图一代码,一定要让你真正彻底明白红黑树
  • js处理select操作总结
  • mysql误删除root用户或者忘记root密码时的解决办法(转)
  • 关于android移动开发
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript设计模式系列一:工厂模式
  • MYSQL 的 IF 函数
  • Mysql5.6主从复制
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • 给新手的新浪微博 SDK 集成教程【一】
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 机器学习学习笔记一
  • 记录:CentOS7.2配置LNMP环境记录
  • 记录一下第一次使用npm
  • 记一次删除Git记录中的大文件的过程
  • 每天10道Java面试题,跟我走,offer有!
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 中文输入法与React文本输入框的问题与解决方案
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 如何在招聘中考核.NET架构师
  • # .NET Framework中使用命名管道进行进程间通信
  • (11)MATLAB PCA+SVM 人脸识别
  • (Java)【深基9.例1】选举学生会
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (三) diretfbrc详解
  • (十六)串口UART
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)LINQ之路
  • (转)winform之ListView
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET程序员迈向卓越的必由之路
  • .NET开发不可不知、不可不用的辅助类(一)
  • .Net转前端开发-启航篇,如何定制博客园主题
  • /etc/shadow字段详解
  • @31省区市高考时间表来了,祝考试成功
  • @AutoConfigurationPackage的使用
  • @Documented注解的作用
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现