码迷,mamicode.com
首页 > 移动开发 > 详细

Android应用开发-页面跳转与数据传递(重制版)

时间:2016-06-18 18:33:07      阅读:277      评论:0      收藏:0      [点我收藏+]

标签:

 

  Android四大组件:ActivityServiceBroadcast ReceiverContent Provider

 

 

创建Activity

 

  • 定义Java类,继承Activity类

  • 在清单文件中配置activity标签

    • activity标签下如果带有下面这部分代码,则会在系统中多创建一个快捷图标

      <intent-filter>
          <action android:name="android.intent.action.MAIN" />
          <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>

       

    • 一个应用程序可以在桌面创建多个快捷图标。

    • Activity的名称、图标可以和应用程序的名称、图标不相同

      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"

       

 

Activity的跳转

 

  Activity的跳转需要创建Intent对象,通过设置Intent对象的参数指定要跳转Activity

    通过指定Activity实现跳转,称为显式意图

    通过指定动作实现跳转,称为隐式意图

 

显式跳转

  • 跳转至同一应用中的Activity

    Intent intent = new Intent();
    intent.setClass(this, SecondActivity.class);// 指定当前的上下文和目标Activity的字节码
    startActivity(intent);

     

  • 跳转至不同应用中的Activity

    Intent intent = new Intent();
    // 指定目标Activity所在的应用的包名和目标Activity的包名加类名,这里启动系统自带的拨号器应用
    intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");
    startActivity(intent);

     

 

隐式跳转

  • 隐式意图跳转至打电话Activity

    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_CALL);
    intent.setData(Uri.parse("tel:10086"));
    startActivity(intent);

     

  • 要让一个Activity可以被隐式启动,需要在该应用清单文件下的activity标签下配置intent-filter子标签

  • 系统会在所有应用的清单文件中寻找与我们创建的隐式Intent匹配的intent-filter,找到则启动,找不到则抛异常

  • 匹配就是intent-filter中定义了什么属性,我们创建的intent中也必须设置什么属性

  • 在清单文件的activity标签下,配置intent-filter子标签,其中再配置actioncategory

 

 

应用场景

  • 启动同一应用中的Activity,用显式Intent。显式启动效率明显高于隐式,因为显示直接指定了目标Activity,隐式需要遍历所有应用的清单文件

  • 启动不同应用中的Activity,用隐式Intent。当使用隐式Intent跳转到其他应用中的Activity时,如果系统找到了多个intent-filter与我们创建的Intent匹配,就会弹出对话框,列举所有匹配的Activity,让用户选择。比如我们的手机里如果安装了多款浏览器App,当我们点击一个URL时,会弹出一个对话框让我们选择使用哪个浏览器来打开这个网页,这就是因为跳转到浏览器Activity用的是隐式Intent;有些应用的Activity启动时需要接收数据,比如打电话Activity需要接收电话号码,也只能用隐式Intent

 

 

Activity跳转时的数据传递

 

  • Activity跳转时,可以把数据封装在Intent中

    Intent intent = new Intent(this, SecondActivity.class);
    intent.putExtra("name", name);
    intent.putExtra("age", age);
    startActivity(intent);

     

  • Intent中可以封装的数据类型:八大基本数据类型和字符串以及它们的数组,还有实现了序列化接口的对象,还有Bundle对象。数据也可以先封装至Bundle,再把Bundle封装至Intent

  • 在跳转到的目标Activity中取出数据

    Intent intent = getIntent();    // 获取启动该Activity的Intent
    String name = intent.getStringExtra("name");
    int age = intent.getIntExtra("age");

     

 

Activity的生命周期

 

技术分享

 

  • onCreate():创建Activity时被回调

  • onStart():在屏幕上可见,但是还没有获得焦点

  • onResume():可见并且获得焦点

  • onPause():可见,但是失去焦点

  • onStop():不可见

  • onDestroy():销毁时调用

  • onRestart():Activity从不可见变为可见时调用

 

  • 按返回键,系统依次回调onPause()onStop()onDestroy(),Activity被销毁,进程还在;若再次进入该Activity,系统会依次回调onCreate()onStart()onResume(),Activity重新进入运行状态

    • 按返回键,Android系统会回调onBackPressed()方法,该方法调用了finish(),所以Activity会被销毁
  • 按Home键,系统依次回调onPause()onStop(),Activity进入停止状态,进程还在;若再次进入该Activity,系统会依次回调onRestart()onStart()onResume(),Activity重新进入运行状态

  • 手机内存不足时,会杀死之前启动的进程,按照LRU(最近最少使用)算法锁定杀死哪个进程

 

 

Activity的四种启动模式

 

  每个应用有一个Activity Task栈,存放已启动的Activity。Activity的启动模式决定了Task栈的操作规则

 

  • standard:默认就是标准模式,每次通过这种模式来启动目标Activity时,Android总会为目标Activity创建一个新的实例,并将该Activity实例添加到Task栈中

  • singleTop:Task栈顶单例模式,与标准模式仅有一点不同:当要启动的目标Activity已经位于Task栈顶时,系统不会重新创建目标Activity的实例,而是直接复用已有的Activity实例

    • 应用:浏览器书签历史记录界面CombinedBookmarkHistoryActivity
    • 应用:短信会话记录界面ConversationList
  • singleTask:Task栈内单例模式,采用这种启动模式的Activity在同一个Task栈内只能有一个实例。如果Activity没有被创建任何实例,那么启动时会创建并入栈;如果已经被创建了一个实例,那么启动时会返回(退栈)至该Activity

    • 应用:浏览器浏览界面BrowserActivity
  • singleInstance:全局单例模式,采用这种启动模式的Activity在整个Android系统内存中只能有一个实例。如果将要启动的目标Activity不存在,系统会先创建一个全新的Task栈,再创建目标Activity的实例,并将他压入新的Task栈顶;如果将要启动的目标Activity已经存在,无论它位于哪个应用程序中、位于哪个Task栈中,系统都会把该Activity所在的Task栈转到前台,从而使该Activity显示出来。需要指出的是,采用singleInstance模式启动的Activity总是位于Task栈顶,且该Task栈中只有该Activity

    • 应用:来电界面InCallScreen

 

 

Activity的横竖屏切换

 

  • 默认情况横竖屏切换会使Activity销毁重建,触发生命周期方法重新执行

  • 在一些特殊的应用程序中,比如游戏,不希望横竖屏切换导致Activity被销毁重建,如果不保存会丢失游戏数据

    • 在清单文件中用以下代码让横竖屏切换时不重建Activity

      android:configChanges="orientation|screenSize|keyboardHidden"

       

    • 在清单文件中可用以下代码写死Activity的屏幕方向

      android:screenOrientation="portrait"     <!-- 竖屏-->
      android:screenOrientation="landscape"    <!-- 横屏-->

       

    • 在java文件中可用以下代码写死Activity的屏幕方向(会覆盖清单文件中的设置)

      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  // 竖屏
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // 横屏

       

 

Activity销毁时返回数据

 

步骤:

  1. 指定请求码requestCode启动新的Activity

    startActivityForResult(intent, requestCode);

     

  2. 在新的Activity中设置要返回的数据

    Intent data = new Intent();
    data.putExtra("tel", tel);
    setResult(resultCode, data);  // 指定一个结果码resultCode,并把数据会返回给原Activity
    finish();

     

  3. 在原Activity里面实现方法

    //通过data获取返回的数据
    onActivityResult(int requestCode, int resultCode, Intent data) {
    
    }

     

  4. 通过判断请求码和结果码确定返回值data的作用

    • 先通过请求码requestCode判断返回的data来自哪个Activity

    • 再通过该Activity返回的结果码resultCode判断data中是该Activity所返回的哪一个数据

 

Android应用开发-页面跳转与数据传递(重制版)

标签:

原文地址:http://www.cnblogs.com/eniac12/p/5596502.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!