zoukankan      html  css  js  c++  java
  • 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 点击快捷回复,跳转到短信选择界面,选择需要快捷回复的短信内容,将短信内容返回到短信编辑器。

    代码:


    安卓开发者,产品爱好者

    个人微博

    欢迎交流
  • 相关阅读:
    js 运算符优先级
    原生js获取样式
    RGBA 与opacity
    闭包(自己的学习+理解~~水水的)
    css 单位-px、em、rem、百分比
    js之正则1
    querySelector和querySelectorAll
    关于瀑布流的算法(转淘宝ued)
    瀑布流的几个注意点
    jsonp跨域
  • 原文地址:https://www.cnblogs.com/jiaowoxiaochen/p/4944048.html
Copyright © 2011-2022 走看看