02. Android基础——活动2

Intent的使用

  1. 使用显示Intent

    1. Intent是Android程序中各组件之间进行交互的一种方式,可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据
    2. 通常被用于启动活动,启动服务,发送广播等
  2. 显式Intent

    1. 例子

      Button button3 = findViewById(R.id.button_3);
      button3.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Intent intent = new Intent(FirstActivity.this,SecondActivity.class);  // 在FirstActivity这个活动的基础上打开SecondActivity这个活动
              startActivity(intent);  // 通过startActivity()方法来执行Intent
          }
      });
      
      • Intent(ContextpackageContext, Class<? >cl):这个构造函数接收两个参数
        • 参数1:Context要求提供一个启动活动的上下文
        • 参数2:class是指定想要启动的目标活动
        • 这个函数可以构造出Intent的意图,即想Intent想要做什么
      • startActivity():用于启动活动,接收一个Intent参数
  3. 隐式Intent

    1. 不明确指出想要启动的活动,而是指定一系列的action和category信息,然后让系统去分析这个Intent,从而找出合适的活动去启动

    2. action和category需要配置在intent-filter标签中

      <activity
                android:name=".SecondActivity"
                android:exported="true" >
          <intent-filter>
              <action android:name="com.example.activitytest.ACTION START"/>
              <category android:name="android.intent.category.DEFAULT"/>
          </intent-filter>
      </activity>
      
      • action标签中,我们指定了一个action

      • category标签中,包含了一些附加信息

      • 只有action和category中的内容同时能够匹配 上Intent中指定的action和category时,这个活动才能响应这个Intent(就是说,AndroidManifest.xml中,指定的activity标签中的action和category和java文件中的action和category一样)

  ```java
  Button button3 = findViewById(R.id.button_3);
  button3.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
         Intent intent = new Intent("com.example.activitytest.ACTION START");
          intent.addCategory("com.example.activitytest.MY CATEGORY");
          startActivity(intent);
      }
  });
  ```

  - Intent()传递的参数就是action中android:name的属性
  - 注意:每个Intent只能指定一个action,但是可以指定多个category
  - 可以使用intent的addCateogry()方法来来添加category
  1. 使用自定义的Intent调用系统自带的浏览器

    Button buttonBrowser = findViewById(R.id.button_browser);
    buttonBrowser.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse("https://www.baidu.com"));
            startActivity(intent);
        }
    });
    
    • Intent.ACTION_VIEW是Android系统内置的动作,常量值是android.intent.action.VIEW
    • Uri.parse()方法可以将一个网址字符串解析成Uri对象
    • Intent的setData方法可以将Uri对象传递进去
    <activity
              android:name=".thirdActivity"
              android:exported="false">
        <intent-filter>
            <action android:name="android:intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="http"/>
        </intent-filter>
    </activity>
    
    • 可以在intent-filter标签中指定data标签,当指定之后,只有和data标签中所有属性内容都一样的Intent才能被相应,data标签中的属性包括:
      • android:scheme:指定协议部分,比如http
      • android:host:指定数据的主机名部分,比如网址
      • android:port:指定端口
      • android:path:指定参数
      • android:mimeType:指定可以处理的数据类型
  2. 向下一个活动传递数据

    1. Intent中提供了一系列的putExtra()方法的重载

    2. 可以认为我们把想要传递的数据暂时存放在Intent中,当另一个活动启动之后,可以把这些数据从Intent中取出来

    3. 例子

      // 在FirstActivity中设置Intent
      Button buttonData = findViewById(R.id.button_data);
      buttonData.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              String data = "Hello Second";
              Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
              intent.putExtra("extra data",data); // 第一个参数是键,第二个是值
              startActivity(intent);
          }
      });
      
      // 在SecondActivity中接收传递的信息
      public class SecondActivity extends AppCompatActivity {
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.second_layout);
      
              // getIntent()方法获取到用于启动SecondActivity的Intent
              Intent intent = getIntent();
      
              // 调用getStringExtra()方法,传递对应的键获取值
              String data = intent.getStringExtra("extra data");
              Log.d("SecondActivity",data);
          }
      }
      
  3. 将数据返回给上一个活动

    1. 使用startActivityForResult()来启动活动,但是它在活动销毁的时候可以将结果返回给上一个活动

    2. 例子

      // firstactivity中
      Button buttonBack = findViewById(R.id.button_back);
      buttonBack.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
              startActivityForResult(intent,1);
          }
      });
      
      // secondactivity中
      Button button22 = findViewById(R.id.button_22);
      button22.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Intent intent1 = new Intent();
              intent1.putExtra("data return","Hello First");
              
              // setResult()方法接收两个参数,第一个用于向上一个活动返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED,第二个参数是把带有数据的Intent穿回去
              setResult(RESULT_OK,intent1);
              finish();  // finish()方法可以销毁当前活动
          }
      });
      

活动的生命周期

    1. 栈是一种后进先出的结构
    2. Android使用任务来管理活动,一个任务就是一组放在栈里面的活动的集合
    3. 当启动一个活动的时候,这个活动会被放入到栈顶,当按下Back键或使用finish()方法的时候,会销毁活动,这个活动从栈顶中弹出
  1. 活动状态
    1. 运行状态
      • 当活动位于返回栈的栈顶时
      • 系统不会去回收这种状态的活动,因为用户体验不好
    2. 暂停状态
      • 当活动不处于栈顶的位置,但是仍然可见,比如对话框形式的活动不会占用整个屏幕,只会占用屏幕的一部分
      • 处于这种状态的活动仍然是存活的,系统也不会去回收这种活动,除非遇到内存极低的情况
    3. 停止状态
      • 一个活动不再处于栈顶位置,并且完全不可见
      • 系统会为这种状态的活动保存相应的状态和成员变量
      • 当其他地方需要内存的时候,处于这种状态的活动会被系统回收
    4. 销毁状态
      • 活动从栈中被移除之后
      • 系统会最先回收这种状态的活动的内存
  2. 活动的声明周期
    1. onCreate()
      • 在活动第一次被创建的时候调用
      • 在整个方法中完成活动的初始化操作,比如加载布局,绑定事件
    2. onStart()
      • 在活动由不可见变成可见的时候调用
    3. onResume()
      • 在活动准备好和用户进行交互的时候调用
      • 此时的活动移动位于栈顶,而且处于运行状态
    4. onPause()
      • 在系统准备去启动或恢复另一个活动的时候调用
    5. onStop()
      • 在活动完全不可见的时候调用
    6. onDestroy()
      • 在活动被销毁前调用,然后活动的状态就变成了销毁状态
    7. onRestart()
      • 在活动由停止状态变成运行状态之前调用
    8. 完整生存期
      • 活动在onCreate()和onDestroy()方法之间经历的周期
    9. 可见生存期
      • 活动在onStart()和onStop()方法之间经历的周期
      • 在这个周期内,活动对于用户总是可见的
    10. 前台生存期
      • 活动在onResume()和onPause()方法之间经历的周期
      • 在这个周期内,活动总是处于运行状态
      • 此时的活动可以和用户进行交互(用户接触最多的也是这个这个周期下的活动)

活动的启动模式

  1. 可以在AndroidManifest.xml中通过activity标签指定android:launchMode属性的值来选择启动模式
  2. standard模式
    1. 默认的启动模式,在不进行显式指定的情况下都是以这种模式启动
    2. 在这种模式下,每次启动一个新活动,都会在栈中入栈
    3. 在这种模式下,系统不会在乎这个活动是否在返回栈中存在,每次启动都会创建该活动的一个新的实例
  3. singleTop模式
    1. 在这种模式下,启动活动时如果发现栈的栈顶已经是这个活动了,就不需要创建新的活动实例了
    2. 只有当启动的活动没有处于栈顶的时候才会创建新的实例
  4. singleTask模式
    1. 在这种模式下,每次启动活动时,系统首先会在栈中检测是否存在该活动的实例,如果已经有了就直接使用,并且把在这个活动之上的所有活动统统出栈,如果没有就创建一个新的活动实例
  5. singleInstance
    1. 在这种模式下,活动会启用一个新的栈来管理活动,主要用来解决共享活动实例的问题
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容