Activity之间的数据传递 任务和回退栈

1有对话框的两个Activity的生命周期函数调用顺序.
1)新建的Activity界面完全盖住原来的Activity界面时:


2)新建的Activity界面以对话框的形式弹出,没有完全盖住原来的Activity界面时:


2、Activity的其他比较重要的方法:
//当Activity被系统杀死,比如内存不足,屏幕的横竖屏切换,希望Activity在被系统杀死之前
保存一些信息,就可以把保存数据的功能写在该方法中
//默认情况下:横竖屏切换,会先杀死当前的Activity,然后再创建一个新的Activity.在创建新的Activity
时,会在onResume之前调用onRestoreInstanceState()方法.杀死原来的,创建新增的


onSaveInstanceState(Bundle outState);


//但是如果不想杀死原来的Activity,还是用原来的Activity来进行横竖屏幕的切换那该怎么办呢?
解决的办法是:在清单文件的Activity注册部分添加一个属性;configChange:"keyboardHidden|orientation|screenSize"
以上三个属性要同时都指定
同时,在清单文件当中配置了如上属性时,会触发以下方法:
onConfigurationChanged(Configuration newConfig);参数Configuration由系统自动创建
newConfig.getLayoutDirection()获取得到屏幕是横屏还是竖屏的方法




//恢复数据 当被杀死的Activity又被重新创建时,执行该方法,在onResume()方法在前被执行
onRestoreInstanceState(Bundle savedInstanceState);




3、Activity之间的数据传递.共有四种传递方式
1)
【1】Intent intent = new Intent(this,TargetActivity.class);
intent.putExtra("name","lisi");
intent.putExtra("age",23);
startActivity(intent);
特别的当intent当中存储对象时,要保证存储的对象是可序列化的.
也就是说,这要求传递的对象的描述类必须implements Serializable接口,以标记该对象是可序列化的


对应的相应在新启动的Activity当中获取数据的方式是:
Intent intent = getIntent();
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age",20);第二个是设置的默认值
Person person = (Person)intent.getSerializableExtra("person");


【2】使用Bundle进行数据传递.其实Intent就是封装的Bundle,所以可以使用Bundle传递
Bundle bundle = new Bundle();
bundle.putString("name","lisi");
bundle.putInt("age",23);
bundle.putSerializable(person);将要传递的数据放入bundle当中
Intent intent = new Intent();
intent.putExtras(bundle);


2)通过使用静态类的方式来解决Activity之间的数据传递问题
将要传递数据封装到一个类当中,全部是静态的成员.
这样,另外的需要数据某些数据的Activity直接到静态类当中获取即可


3)第三类则是使用代表应用的对象Application进行数据的传递,此种传递方式叫全局传值
自己顶一个MyAapplication继承Application,用于封装要传递的数据
在清单文件中的application标签当中配置自己新写的自定义myapplication
在Activity程序当中:
MyApplication app = (MyApplication)getApplication();
String name = app.getName();
int age = app.getAge();
...


4)最后一类数据传递方式,不仅可以将数据从一个Activity传递到另一个Activity中,
同时还可以实现新的Activity返回数据到当前Activity当中这一效果
在Activity程序当中使用startActivityForResult(intent,requestCode);
第一个参数是意图对象intent,第二个参数是请求码requestCode,该请求码可以自己定义


另外还有一个特定的获取返回数据的方法,onActivityResult(
int requestCode,
int resultCode,
Intent data);该方法在请求完数据然后返回回来时由系统自动调用.
 
具体的代码步骤:
1)请求端Activity (A)
第一步:创建Intent对象,并向intent里面组装请求的相关数据
第二步:在开启第二个Activity的代码的地方调用请求方法,startActivityForResult(intent,requestCode);
其中第一个参数就是第一步组装的intent对象;第二个参数是用户自定义的请求码,一般为静态常量


2)响应端Activity (B)
第一步:获取Intent对象并从中获取请求端发送的数据:Intent intent  = getIntent(); 并获取相关数据
第二步:根据请求端的数据进行相关的操作.得到相关结果
第三步:创建Intent对象intent,并将处理的相关结果封装到intent当中
第四步:在相关的地方调用setResult(RESULT_OK, intent);方法 相当于对请求的响应返回


3)由于响应端Activity(B)端已经处理了请求并将结果返回,所以,这个时候可以要在A端的Activity里面
相应的地方写代码对得到响应数据,在android中,只需要重写onActivityResult(
requestCode,
resultCode,
Intent data)
进行重写即可.
特别说明:由于B端可能接受多个Activity的请求,所以要对响应结果进行判断才能保证响应的数据和请求
是对应的.常用的判断就是 if(requestCode==RESQUESTCODE&&resultCode==this.RESULT_OK)
如果满足以上条件,则说明响应和请求是对应的,这时候就可以从data中取响应数据进行相关操作了.




下午:
4、任务和回退栈


android Application在运行的时候,每一个Application是由很多的Activity组成的.而
Activity恰恰是用户定义的用于实现某个特殊功能的代码,其可以实现某些特定功能,或者
还可以用以控制开启其他的一个新的Activity


   在android引用当中.一个任务由多个相关联的activity构成,多个Activity位于回退栈中.同一个任务
中的Activity位于同一个回退栈中
   Activity不存在了,那么任务也就不存在了
  
   切记:切记:特别注意:回退栈中Activity的顺序是按照Activity被启动的顺序进栈的


5、启动模式(Launch modes)
Activity的四种启动模式:
1)在androidManifest.xml文件中进行声明
例:<activity android:launchMode="standard" ... />
如上,如果要指定某个Activity的加载模式,则在manifest.xml文件中的Activity声明处加上launchMode
属性配置即可,其alunchMode有四个值:standard(默认就是该值),singleTop,singleTask,singleInstance
下面会挨个介绍每一个值所代表的模式和特点.


2)SingleTop模式:
  该模式使用的场景是:如果一个Activity的启动模式是SingleTop,并且位于栈顶,才不会创建新的实例
  那么也就是说:如果某个Activity的启动模式是SingleTop,但是不位于栈顶,仍然会创建新的实例
  上面说的很清楚了,强调了两个条件同时存在的必要性.在使用时一定要格外的注意.
例子:day22//day22_gp03_SingleTop小项目例子




3)SingleTask模式:
  SingleTask模式的特点是:如果某个Activity的加载模式是SingleTask模式,那么在所有的任务中就
只有一个该Activity的实例;在该模式下,允许其他的Activity和该模式的Activity位于同一个任务中,
当通过意图转到该模式的Activity时,系统将会杀死所有位于它之上的Activity(借助栈结构来理解)
其应用的场景往往是:从一个应用当中开启访问另外一个应用的SingleTask的Activity




4)Single Instance
Single Instance就是在系统中某个功能是以任务出现的,且就只有一个任务.例如:打电话的功能,
当使用拨号功能进行拨号时,就是打电话的功能,由于打电话的功能是一个Single Instance的任务.
所以会新建一个任务执行.当从别的应用当中调用打电话的功能时,系统也是会新开一个任务来打电话.
    说到这里,其实就可以理解了,所谓Single Instance模式简单理解就是将某个功能设计成任务的形式.
无论何种时候,只要是使用该功能,就以新任务的形式出现,而不会出现和其他Activity一起加入某个回退栈
的情况.




6、详述Intent
1)显示意图:(三种方式)
[1]:Intent intent = new Intent(this,TargetActivity.class);
    startActivity(intent);
[2]:Intent intent = new Intent();
    intent.setClass(this, TargetActivity.class);
    startActivity(intent);
[3]:Intent intent = new Intent();
    ComponentName component = new ComponentName("com.example.day22_gp03_intent", "com.example.day22_gp03_intent.TargetActivity");
    intent.setComponent(component);
    startActivity(intent);




2)隐式意图:没有明确指明要跳转到的组件
通过action、category两个属性来匹配要跳转到的组件


特别地,若要使用隐式意图,则需要在清单文件中进行以下配置
具体操作:
<action android:name=""/>
...可以写多个
<category android:name=""/>
..也可以写多个
<data 
     android:scheme=""
     android:host=""
     android:port=""
     android:path=""
/>用于数据匹配的data属性


Uri格式:  scheme://host:port/path
需要用什么样的功能,就将scheme处换成系统定义的相应功能的scheme,比如说:打电话是tel,发短信是smto


以上data配置项中的四个属性,可以只定义第一个,省略后面三个;也可以定义前两个省略后两个;
...依次..即可以只定义前面的,省略后面的;但是如果定义了后面的,那么前面的一定要定义,否则就错了.


例子:实现调用系统的打电话,发短信的功能






程序中的写法:
android.setAction(清单文件中配置的Activity的过滤器属性值,并进行匹配);
startActivity(intent);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值