Intent的使用
-
使用显示Intent
- Intent是Android程序中各组件之间进行交互的一种方式,可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据
- 通常被用于启动活动,启动服务,发送广播等
-
显式Intent
-
例子
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参数
- Intent(ContextpackageContext, Class<? >cl):这个构造函数接收两个参数
-
-
隐式Intent
不明确指出想要启动的活动,而是指定一系列的action和category信息,然后让系统去分析这个Intent,从而找出合适的活动去启动
-
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
-
使用自定义的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:指定可以处理的数据类型
-
向下一个活动传递数据
Intent中提供了一系列的putExtra()方法的重载
可以认为我们把想要传递的数据暂时存放在Intent中,当另一个活动启动之后,可以把这些数据从Intent中取出来
-
例子
// 在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); } }
-
将数据返回给上一个活动
使用startActivityForResult()来启动活动,但是它在活动销毁的时候可以将结果返回给上一个活动
-
例子
// 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()方法可以销毁当前活动 } });
活动的生命周期
- 栈
- 栈是一种后进先出的结构
- Android使用任务来管理活动,一个任务就是一组放在栈里面的活动的集合
- 当启动一个活动的时候,这个活动会被放入到栈顶,当按下Back键或使用finish()方法的时候,会销毁活动,这个活动从栈顶中弹出
- 活动状态
- 运行状态
- 当活动位于返回栈的栈顶时
- 系统不会去回收这种状态的活动,因为用户体验不好
- 暂停状态
- 当活动不处于栈顶的位置,但是仍然可见,比如对话框形式的活动不会占用整个屏幕,只会占用屏幕的一部分
- 处于这种状态的活动仍然是存活的,系统也不会去回收这种活动,除非遇到内存极低的情况
- 停止状态
- 一个活动不再处于栈顶位置,并且完全不可见
- 系统会为这种状态的活动保存相应的状态和成员变量
- 当其他地方需要内存的时候,处于这种状态的活动会被系统回收
- 销毁状态
- 活动从栈中被移除之后
- 系统会最先回收这种状态的活动的内存
- 运行状态
- 活动的声明周期
- onCreate()
- 在活动第一次被创建的时候调用
- 在整个方法中完成活动的初始化操作,比如加载布局,绑定事件
- onStart()
- 在活动由不可见变成可见的时候调用
- onResume()
- 在活动准备好和用户进行交互的时候调用
- 此时的活动移动位于栈顶,而且处于运行状态
- onPause()
- 在系统准备去启动或恢复另一个活动的时候调用
- onStop()
- 在活动完全不可见的时候调用
- onDestroy()
- 在活动被销毁前调用,然后活动的状态就变成了销毁状态
- onRestart()
- 在活动由停止状态变成运行状态之前调用
- 完整生存期
- 活动在onCreate()和onDestroy()方法之间经历的周期
- 可见生存期
- 活动在onStart()和onStop()方法之间经历的周期
- 在这个周期内,活动对于用户总是可见的
- 前台生存期
- 活动在onResume()和onPause()方法之间经历的周期
- 在这个周期内,活动总是处于运行状态
- 此时的活动可以和用户进行交互(用户接触最多的也是这个这个周期下的活动)
- onCreate()
活动的启动模式
- 可以在AndroidManifest.xml中通过activity标签指定android:launchMode属性的值来选择启动模式
- standard模式
- 默认的启动模式,在不进行显式指定的情况下都是以这种模式启动
- 在这种模式下,每次启动一个新活动,都会在栈中入栈
- 在这种模式下,系统不会在乎这个活动是否在返回栈中存在,每次启动都会创建该活动的一个新的实例
- singleTop模式
- 在这种模式下,启动活动时如果发现栈的栈顶已经是这个活动了,就不需要创建新的活动实例了
- 只有当启动的活动没有处于栈顶的时候才会创建新的实例
- singleTask模式
- 在这种模式下,每次启动活动时,系统首先会在栈中检测是否存在该活动的实例,如果已经有了就直接使用,并且把在这个活动之上的所有活动统统出栈,如果没有就创建一个新的活动实例
- singleInstance
- 在这种模式下,活动会启用一个新的栈来管理活动,主要用来解决共享活动实例的问题