页面跳转即数据传递


创建第二个界面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 --- 页面跳转及数据传递的更多相关文章

  1. Android应用开发基础之六:页面跳转和数据传递

    创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-filter> <action ...

  2. Android初级教程理论知识(第五章页面跳转和数据传递)

    总体概述: Android四大组件 Activity BroadCastReceiver Service ContentProvider 创建第二个activity 新创建的activity,必须在清 ...

  3. iOS页面跳转及数据传递

    转: http://blog.csdn.net/wang9834664/article/details/8025571 iOS页面跳转: 第一种 [self.navigationController  ...

  4. android 学习随笔十四(页面跳转与数据传递)

    1.activity 创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-filter> ...

  5. Android实现页面跳转、ListView及其事件

    Android实现页面跳转.ListView及其事件 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 进入主页面后,使用ListView实现特 ...

  6. Flutter页面跳转返回数据

    Dart中的异步请求和等待和ES6中的方法很像,直接使用async...await就可以实现. 核心代码: _navigateToAddress(BuildContext context) async ...

  7. TopJUI | easyui HTML Dialog页面间GET方式数据传递

    较容易的方式通过URL内带参数进行数据传递 var url = "apddList.html?c0=" + row.uuid + "&c1=" + ro ...

  8. Android项目页面跳转小Demo

    近期在做Android项目的开发,刚刚接触会有非常多新东西须要学习,从环境的搭建到语言的熟悉都是须要一步步完毕的,接下来就拿一个页面跳转的样例来和大家分享一下自己的心得体会. 採用的架构: Demo中 ...

  9. JQueryMobile页面跳转参数的传递解决方案

    在JQueryMobile开发手机端应用使用可能需要考虑相关的页面跳转带来的参数问题.因为JQueryMobile其实也是HTML5实践的结果.HTML5中有localStorage和sessionS ...

随机推荐

  1. 深入理解js的prototype以及prototype的一些应用

    上一篇讲了js的prototype概念,在这里回顾一下prototype的定义: prototype是函数的一个属性,并且是函数的原型对象.引用它的必然是函数,这个应该记住. 但是,很奇怪,各位看官, ...

  2. 使用NUGet自动下载(还原)项目中使用的包

    签出完整项目后,在解决方案名称上点右键,选择"启用NuGet程序包还原",如下图: 出现询问,当然要点是:是 当完成后,会发现在解决方案中,多出".nuget" ...

  3. iOS,多媒体,地图相关

    1.本地音频播放 2.本地视频播放 3.使用UIImagePickerController摄像头拍照,录像,照片库浏览 4.使用AVFunction,AVCaptureVideoDataOutput实 ...

  4. object_id用法

    特别是在建表建存储过程的时候进场会写到: IF OBJECT_ID('Table_Test','U') IS NOT NULL DROP TABLE Table_Test 这种方式代替了以往所使用的 ...

  5. laravel5.3----------调度任务以及Artisan

    1.在使用的过程中会遇到有些函数不能用需要在php配置文件里面打开: disable_functions = exec,passthru,popen,proc_open,shell_exec,syst ...

  6. 为什么这些java接口没有抽象方法?浅谈Java标记接口

    在jdk的源码中,存在这样的一些接口,他们不包含任何的(抽象)方法,但是却广泛的存在. 这种接口我们称之为Mark Interface,也就是标记接口. 这些接口呢,我们不用来实现任何的方法,他们的作 ...

  7. SVD java 算法实现

    https://github.com/Richard-Cao/MatrixSvdDemo/blob/master/app/src/main/java/me/ele/caolicheng/matrixs ...

  8. win2012,oracle11g,sqlplus切换实例的方法

    问题环境:windows 2012 r2 64位  ,oracle 11.2.0.4,多个实例. 在这种情况下, sqlplus "/as sysdba" 默认登录的是系统后面安装 ...

  9. 关于linux下关于ssd的使用

    1. 这几个文件系统可以在挂载的时候使用 discard  选项:ext4, xfs, jfs, vfat 2. 使用 fstrim 命令可以实现周期性的 trim,挂载时使用discard标记可以实 ...

  10. 基于海明距离的加权平均值人职匹配模型(Sqlserver2014/16内存表实现)

    最近给某大学网站制作一个功能,需要给全校所有的学生提供就业单位发布职位的自动匹配,学生登陆就业网,就可以查看适合自己的职位,进而可以在线投递. 全校有几万名学生,注册企业发布的职位也有上万,如何在很短 ...