Android first --- 页面跳转及数据传递
页面跳转即数据传递
创建第二个界面Acivity
*需要在清单文件中添加配置一个Actuvity标签
标签中如果带有这个子节点,则会在Android中添加一个快捷图标
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
另外需要创建出第二个界面还需要在第二节界面中书写代码
setContentView(R.layout.activity_second);
在 创建第二个快捷图标可以了解到我们可以在同一个application中创建多个图标分别表示同一个applicatilon中的不同界面快捷图标
Activity的跳转
Activity的跳转需要创建Intent对象,通过设置Intent对象的参数指定要跳转的Activity
通过设置Activity的包名和类名实现跳转,称为显式意图
通过指定动作实现跳转,称为隐式跳转
显示意图
清单文件设置
在跳转至同一个项目下的另一个Activity,直接指定该Activity的字节码即可
Intent intent = new Intent(); //定义意图
intent.setClass(this, SecondActivity.class);
startActivity(intent);
跳转至其他应用中的Activity,需要指定该应用的包名和该Activity的类名
Intent intent = new Intent();
//启动系统自带的拨号器应用
intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");
startActivity(intent);
隐式意图
隐式意图跳转至指定Activity
Intent intent = new Intent();
//启动系统自带的拨号器应用
intent.setAction(Intent.ACTION_DIAL);
startActivity(intent);
要让一个Activity可以被隐式启动,需要在清单文件的activity节点中设置intent-filter子节点
<intent-filter >
<action android:name="com.itheima.second"/>
<data android:scheme="asd" android:mimeType="aa/bb"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter> * action 指定动作(可以自定 义,可以使用系统自带的)
* data 指定数据(操作什么内容)
* category 类别 (默认类别,机顶盒,车载电脑)
隐式意图启动Activity,需要intent设置三个以上属性,且必须与该Activity在清单文件中对应的三个属性定义一一匹配
intent-filter节点及其子节点都可以同时定义多个,隐式启动时只需与任意一个匹配即可
获取通过setData传递的数据
Activity通过Intent启动时,可以通过Intent对象携带数据到目标Activity
Intent intent = new Intent(this, SecondActivity.class);
//把数据封装至intent对象中
//intent.putExtra("malename", "李志");
//intent.putExtra("femalename", "芙蓉姐姐"); //把数据封装至bundle对象中
Bundle bundle = new Bundle();
bundle.putString("malename", "李志");
bundle.putString("femalename", "芙蓉姐姐"); //把bundle对象封装至intent对象中
intent.putExtras(bundle);
startActivity(intent);
在目标Activity中取出数据
Intent intent = getIntent();
//从intent对象中把封装好的数据取出来
//String maleName = intent.getStringExtra("malename");
//String feMaleName = intent.getStringExtra("femalename"); Bundle bundle = intent.getExtras();
String maleName = bundle.getString("malename");
String feMaleName = bundle.getString("femalename"); Random rd = new Random();
int yinyuan = rd.nextInt(100); TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(maleName + "和" + feMaleName + "的姻缘值为" + yinyuan);
生命周期
void onCreate()
- Activity已经被创建完毕
void onStart()
- Activity已经显示在屏幕,但没有得到焦点
void onResume()
- Activity得到焦点,可以与用户交互
void onPause()
- Activity失去焦点,无法再与用户交互,但依然可见
void onStop()
- Activity不可见,进入后台
void onDestroy()
- Activity被销毁
void onRestart()
- Activity从不可见变成可见时会执行此方法
使用场景
- Activity创建时需要初始化资源,销毁时需要释放资源;或者播放器应用,在界面进入后台时需要自动暂停
完整生命周期(entire lifetime)
- onCreate-->onStart-->onResume-->onPause-->onStop-->onDestory
可视生命周期(visible lifetime)
- onStart-->onResume-->onPause-->onStop
前台生命周期(foreground lifetime)
- onResume-->onPause
Activity的四种启动模式
- 每个应用会有一个Activity任务栈,存放已启动的Activity
Activity的启动模式
SingleTop 单一顶部模式: 如果任务栈的栈顶存在这个要开启的Activity,不会重新创建Activity,而是复用已经存在的Activity,如果栈顶存在则不会再次创建
singleTask 单一任务栈 : 在当前任务栈中只能存在一个实例,如果有实例存在就复用这个已经存在的Activity,并且把这个Activity上面的Activity全部清空,复用这个已经存在的Activity,使得任务栈中只有一个实例存在,这种任务栈可应用在浏览器当中。如果一个Activity的创建需要占用大量的系统资源,但是又可以在多个应用中关联启动时,可以使用这种启动模式。webkit内核 c代码
singleInstance启动模式 : singleInstance启动模式非常特殊,Activity会运行在自己的任务栈里面,并且这个任务栈里面只有一个实例存在。如果要使得整个手机操作系统中只有一个实例存在,使用singleInstance启动模式。应用场景:电话拨打界面
横竖屏界面切换是的生命周期
- 默认的情况下,横竖屏切换的Activity,会使得原Activity销毁后重新创建新的Activity后显示
- 横竖屏在模拟器中切换使用 : CTRL+F11
- 在有些应用的需求中不能进行默认的横竖屏切换时关闭原有的界面在重新创建新的界面,这是可以使用代码将横竖屏写死:
在Manifest里对于的activity加上这个配置就不会重走销毁和创建了,如下:
android:configChanges="orientation|keyboardHidden|screenSize"
- 解决方法:针对横竖屏不同的布局,我们只需在创建一个layout-land文件夹,里面放同名的布局文件,onCreate时会自动加载相对应的横竖屏布局。 在横竖屏切换的过程中会经历onSaveInstanceState,给你一个保存数据的机会:
@Override
public void onSaveInstanceState(Bundle outState) {
Log.i("linc", "onSaveInstanceState(Bundle)");
super.onSaveInstanceState(outState); outState.putString(TEXT_ONE, ""+editText1.getTag(R.id.tag_first));//>avoid null point
//outState.putSerializable();//object
}
*然后将数据取出来
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_land_port_switch);
Log.e("linc","oncreate");
editText1 = (EditText)findViewById(R.id.txt1);
// Restore saved state.
if (savedInstanceState != null) {
editText1.setTag(R.id.tag_first,savedInstanceState.getString(TEXT_ONE));
}
} protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_land_port_switch);
Log.e("linc","oncreate");
editText1 = (EditText)findViewById(R.id.txt1);
// Restore saved state.
if (savedInstanceState != null) {
editText1.setTag(R.id.tag_first,savedInstanceState.getString(TEXT_ONE));
}
}
掌握开启Activity获取返回值
从A界面跳转到B界面,B界面关闭的时候返回带着数据给A界面
- 跳转页面并且开启 Activity 并且获取返回值
//跳转至选择联系人Activity
Intent intent = new Intent(this, ContactActivity.class);
//用这个api启动的Activity,在销毁时,系统会回调onActivityResult
startActivityForResult(intent, 10);
- 在新开启的界面里实现数据的逻辑
ListView lv = (ListView) findViewById(R.id.lv);
final String[] objects = new String[]{
"小志,教教我泡妞",
"逼哥,带我飞吧",
"世界就在我的脚下",
"国服打野第一"
};
//将objects数组中的数据显示在页面中
lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item_listview, R.id.tv, objects));
//给listview设置条目的点击侦听
lv.setOnItemClickListener(new OnItemClickListener() {
//当某个条目被点击时,此方法调用
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//Activity返回时传递数据,也是通过意图对象
Intent data = new Intent();
//把要传递的数据封装至意图对象中
data.putExtra("name", objects[position]);
//当前Activity销毁时,data这个意图就会传递给启动当前Activity的那个Activity
setResult(1, data);
//销毁当前Activity
finish();
}
});
- 在开启者的Activity里面实现方法
//如果有Activity在销毁时返回了数据,那么就会调用此方法来接收数据
//requestCode:用来区分数据来自于哪一个Activity
//resultCode:用来区分返回的数据是什么类型的
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String name = data.getStringExtra("name");
if(requestCode == 10){
EditText et = (EditText)findViewById(R.id.et);
et.setText(name);
}
else if(requestCode == 20){
EditText et_content = (EditText)findViewById(R.id.et_content);
et_content.setText(name);
}
}
- 如果同一个界面返回的数据有多种,可以根据结果吗进行区分,然后实现不同的操作
Android first --- 页面跳转及数据传递的更多相关文章
- Android应用开发基础之六:页面跳转和数据传递
创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-filter> <action ...
- Android初级教程理论知识(第五章页面跳转和数据传递)
总体概述: Android四大组件 Activity BroadCastReceiver Service ContentProvider 创建第二个activity 新创建的activity,必须在清 ...
- iOS页面跳转及数据传递
转: http://blog.csdn.net/wang9834664/article/details/8025571 iOS页面跳转: 第一种 [self.navigationController ...
- android 学习随笔十四(页面跳转与数据传递)
1.activity 创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-filter> ...
- Android实现页面跳转、ListView及其事件
Android实现页面跳转.ListView及其事件 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 进入主页面后,使用ListView实现特 ...
- Flutter页面跳转返回数据
Dart中的异步请求和等待和ES6中的方法很像,直接使用async...await就可以实现. 核心代码: _navigateToAddress(BuildContext context) async ...
- TopJUI | easyui HTML Dialog页面间GET方式数据传递
较容易的方式通过URL内带参数进行数据传递 var url = "apddList.html?c0=" + row.uuid + "&c1=" + ro ...
- Android项目页面跳转小Demo
近期在做Android项目的开发,刚刚接触会有非常多新东西须要学习,从环境的搭建到语言的熟悉都是须要一步步完毕的,接下来就拿一个页面跳转的样例来和大家分享一下自己的心得体会. 採用的架构: Demo中 ...
- JQueryMobile页面跳转参数的传递解决方案
在JQueryMobile开发手机端应用使用可能需要考虑相关的页面跳转带来的参数问题.因为JQueryMobile其实也是HTML5实践的结果.HTML5中有localStorage和sessionS ...
随机推荐
- Open Close Principle 开闭合原则
- [CC]平面拟合
常见的平面拟合方法一般是最小二乘法.当误差服从正态分布时,最小二乘方法的拟合效果还是很好的,可以转化成PCA问题. 当观测值的误差大于2倍中误差时,认为误差较大.采用最小二乘拟合时精度降低,不够稳健. ...
- javascript 函数重载 overloading
函数重载 https://en.wikipedia.org/wiki/Function_overloading In some programming languages, function over ...
- Lua屏蔽对象方法和恢复的方法
背景 对于OO思想实现的类, 对于某些场景需要屏蔽某些方法, 不让调用.过了这段场景, 就恢复这些类的方法, 可以调用. 例如: 工厂具有开工方法, 但是在晚上不允许开工, 所有在晚上这段时间, 见开 ...
- Android四大核心组件之BroadCastReceiver
实验内容 实现BroadCast发送和接受 通过BroadCast传递信息 动态注册和注销BroadCast 实验要求 实现BroadCast发送和接受 通过BroadCast传递信息 动态注册和注销 ...
- Java类WebServer及中间件拿webshell方法总结
0.序 原文名称:Tomcat.Weblogic.JBoss.GlassFish.Resin.Websphere弱口令及拿webshell方法总结 原文from:http://www.hack80.c ...
- iOS开发:http中的get和post请求
什么是 HTTP ? 超文本传输协议(HTTP)的设计目的是保证客户端与服务器之间的通信. HTTP 的工作方式是客户端与服务器之间的请求-应答协议. web 浏览器可能是客户端,而计算机上的网络应用 ...
- Uml学习-用例建模简介
用例建模简介 用例建模是UML建模的一部分,它也是UML里最基础的部分.用例建模的最主要功能就是用来表达系统的功能性需求或行为.用例图重点描述用户需求. 它描述需求.用户和主要组件之间的关系. 它不 ...
- Learning From Data 第一章总结
之前上了台大的机器学习基石课程,里面用的教材是<Learning from data>,最近看了看觉得不错,打算深入看下去,内容上和台大的课程差不太多,但是有些点讲的更深入,想了解课程里面 ...
- (最重要)学了这么久的编程,你知道byte吗?
在c#中,Byte b=12; 上面是合法的,因为Byte是一个字节.他的范围是0-255. 如果是 Byte b=4096;这是错的 ,必须加上强制类型转换. 这个小问题,虽然很小但是值得注意.