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 ...
随机推荐
- windows查看端口占用以及关闭相应的进程
开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...
- CSS中定位和浮动对行内元素的宽高的影响
行内元素的大小是由元素里面的内容撑开的宽高决定的,就算在css中对行内元素设置width,height.行内元素也会忽略宽高的设置. 但是当行内元素使用position:absolute或者posit ...
- 两个有意思的模式在ECMAScript中的实现
简介 本篇文章对设计模式进行了筛选, 只列举两个有意思(坑)的设计实现, 如有错误愿闻其详. 构造函数 ECMAScript中的构造函数和其他语言的有那么点特别之处,可以认为, 一个函数, 如果被以n ...
- Python学习【第九篇】函数
函数 函数是什么? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上而下实现功能,其往往用一段代码来实现指定功能,开发过 ...
- 《机电传动控制》PLC仿真
1.红绿灯 经仿真,可以完成所设定的要求.对比普通的红绿灯,知识加了X25和X20的控制,来控制夜间模式 . 2.传送带 经仿真,可以完成所设定的要求. 总结:这两个仿真都是亲自完成,感觉难度有些大. ...
- C# MVC jsonp初接触成功
利用jsonp进行跨域请求资源 C# MVC ApiControllers准备如下: 1.需要在引用处右键管理NuGet安装jsonp插件 2.在Application_Start()中配置 Glob ...
- 通过jxl 读取excel 文件中的日期,并计算时间间隔
java读取excel里面的日期会出现相差8小时的问题. 比如excel里面有一个日期是:2012-7-2 17:14:03秒,用Cell cell=readSheet.getCell(colNo, ...
- [Android] ListView关于adapter多种view设置
使用的关键点是在adapter覆盖两个方法 public int getItemViewType(int position) public int getViewTypeCount() 其它的可另go ...
- 关于oracle数据库中进行查询的时候出现效率特别差的一种情况
下面这段代码执行效率是极慢的(根本没执行完成过): select /*+ parallel(16) */ z.small_code,trunc(hs.CREATED_AT),sum(hs.COST_S ...
- 第一次写这么长的js
是公司一个项目,要求显示不同的sku,然后根据sku组合显示不同的价格区间,根据填写的数量落在哪个价格区间,然后进行计算.实际截图如下: 前端JS如下: <script type="t ...