Android四大组件之Activity


Activity概述:

  在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。


Activity的跳转:

      在实现Activity跳转之前,先来创建第二个Activity,写第二布局文件Activity_second.xml,写SecondActivity类继承Activity,在onCreate方法里面加如代码使布局文件显示在界面:setContentView(R.layout.activity_second);
要显示第二个Activity还需要在清单文件中为其配置一个activity标签指定name. 如果activity子节点中有一下代码则代表一个入口activity,则会在系统中多创建一个快捷图标 代码: 
        <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
一个应用程序可以在桌面上创建多个图标,activity的名称、图标可以和应用程序的名称、图标不相同 只需在activity中做一下配置
       android:icon="@drawable/ic_launcher"指定图标
       android:label="@string/app_name" 指定名称
完成第二个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);
隐式跳转:使用意图对象的setAction方法指定要跳转的activity

    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_CALL);
    startActivity(intent);

如果 要让一个Activity可以被隐式启动,需要在清单文件的activity节点中设置intent-filter子节点

    <intent-filter >
    <action android:name="com.jiaowoxiaochen.sa2"/>  //name的值可以自定义 
    //action指定动作通过这个name跳转
    <data android:scheme="asd" android:mimeType="text/username"/>
    //date指定数据 scheme 指定数据格式 mimeType指定数据格式可以自己定义
    <category android:name="android.intent.category.DEFAULT"/>
    //做一个标记指定类别,一般使用DEFAULT可以不写
    </intent-filter>

    public void click5View v){
    Intent intent = new Intent();
    intent.setAction("com.jiaowoxiaochen.sa2"); //和name名匹配
    intent.setDataAndType(Uri.parse("asd:123"), "text/username");
    startActivity(intent);
    } 
显示跳转和隐式跳转的应用场景:

  显示跳转用于启动同一个应用中的activity。
  隐式跳转用于启动不同应用中的activity。 
  * 如果系统中存在多个Activity的intent-filter同时与你的intent匹配,那么系统会显示一个对话框,列出所有匹配的Activity,由用户选择启动哪一个
  显示跳转的效率远远大于隐式跳转,显示跳转直接通过包名找到跳转的activity而隐式跳转需要找到所有清单文件并选择匹配的意图过滤标签。



在显示和隐式跳转中如何传递数据:

  显示跳转传递数据有两种方式:

    方法一直接放入到intent对象中

      Intent intent = new Intent(this, SecondActivity.class);
      intent.putExtra("name","马云");
      intent.putExtra("sex","男");
      startActivity(intent);

    方法一在SecondActivity中取出数据的方式

      Intent intent = getIntent();
      intent.getStringExtra("name");
      intent.getStringExtra("sex");

    方法二 把数据封装至Bundle对象中,

      Intent intent = new Intent(this,SecondActivity.class);
      Bundle bundle = new Bundle();
      bundle.putString("name","马云");
      bundle.putStirng("sex","男");
      intent.putExtras(bundle);
      startActivity(intent);

    方法二在SecondActivity中取出数据的方式

      Intent intent = getIntent();
      Bundle bundle = intent.getExtras();
      String name = bundle.getString("name");
      String sex = bundle.getString("sex");
隐式跳转传递数据:

隐式跳转也可以使用意图对象传递数据代码同显示跳转传递数据,一般情况下都使用意图对象传递数据。

如果过滤器中指定了data的子节点,那么必要按照data子节点的配置的格式传递数据,不然会找不到指定的过滤器。

      //传数据
      Intent intent = new Intent( );       intent.setAction("com.itheima.sa2");       intent.setData(Uri.parse("heima2:qwe")); startActivity(intent); //在跳转的activity中取数据
      Intent intent = getIntent();
      Uri uri = intent.getData();

  


Activity生命周期:

          

activity生命周期的各个方法解释

  void onCreate() //Activity已经被创建完毕

  void onStart()//Activity已经显示在屏幕,但没有得到焦点

  void onResume()// Activity得到焦点,可以与用户交互

  void onPause()// Activity失去焦点,无法再与用户交互,但依然可见

  void onStop()// Activity不可见,进入后台

  void onDestroy()//Activity被销毁

  void onRestart()//Activity从不可见变成可见时会执行此方法

使用场景
   Activity创建时需要初始化资源onCreate(),销毁时需要释放资源onDestroy();或者播放器应用,在界面进入后台时需要自动暂停onStop()

内存不足时:
   内存不足时,系统会优先杀死后台Activity所在的进程,都杀光了,如果内存还是不足,那么就会杀死暂停状态的Activity所在的进程,如果还是不够,有可能杀死前台进程
  如果有多个后台进程,在选择杀死的目标时,采用最近最少使用算法(LRU)


Activity的启动模式

  Activity任务栈

  应用运行过程中,内存中可能会打开多个Activity,那么所有打开的Activity都会被保存在Activity任务栈
  栈:后进先出,最先进栈,就会最后出栈

  启动模式详解:

    标准模式:默认就是这个模式

    singleTop:(单一顶部模式)如果目标Activity不在栈顶,那么就会启动一个新的Activity,如果已经在栈顶了,那么就不会再启动了  应用场景:浏览器的书签

    singleTask:(单一任务栈,在一个任务栈中只有一个实例存在)如果栈中没有该Activity,那么启动时就会创建一个该Activity,如果栈中已经有该Activity的实例存在了,
      那么在启动时,就会杀死在栈中处于该Activity上方的所有Activity,那么此时该Activity就成为了栈顶Activity。应用场景:浏览器的activity,或者一个activity的创建需要占用大量的系统资源。
      singleTask的作用:保证整个栈中只有一个该Activity的实例
    singleInstance:设为此模式的Activity会有一个自己独立的任务栈,该Activity的实例只会创建一个,保存在独立的任务栈中  应用场景: 电话拨打界面
       singleInstance的作用:保证整个系统的内存中只有一个该Activity的实例

  设置启动模式的方法:

    在清单文件中的activity节点设置 launchMode值

    <activity 

      android:launchMode="singleInstance"
      android:name="com.jiaowoxiaochen.lifecycle.SecondActivity"
    ></activity>

 


 横竖屏切换的生命周期:

     默认情况下 ,横竖屏切换, 销毁当前的activity,重新创建一个新的activity。

    在一些某些的应用程序常见下,不希望横竖屏切换activity被销毁重新创建,有两种方法:

      方法一:让系统的环境 不再去敏感横竖屏的切换。

         在清单文件中配置 configChanges的值为orientation|keyboardHidden|screenSize

      <activity
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:name="com.jiaowoxiaochen.life.MainActivity"
         android:label="@string/app_name" >

    方法二 :写死方向,不允许切换

          写习方向同样有两个方法:

            第一可以再清单文件中配置

              <activity
                android:screenOrientation="landscape" // landscape 风景表示横屏 portrait肖像 表示竖屏
                android:name="com.jiaowoxiaochen.life.MainActivity"
                android:label="@string/app_name" >              

          第二种用java代码写死

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

              ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE横屏   在activity以创建的时候就写死


 简单实现案例:

  运用activity的跳转携带数据和跳转返回数据写短信发送器。

主界面如下:

       

需求:1 点击+按钮 跳转到联系人界面 选择联系人,将联系人的名字返回到联系人输入框中。

   2 点击快捷回复,跳转到短信选择界面,选择需要快捷回复的短信内容,将短信内容返回到短信编辑器。

代码:


安卓开发者,产品爱好者

个人微博

欢迎交流
原文地址:https://www.cnblogs.com/jiaowoxiaochen/p/4944048.html