第四章 意图(Intent)
终端用户用于开发应用程序交互功能的组件:广播接收器、意图、适配器、内容提供器
Intent由动作(action)、数据(Data)、分类(Category)、类型(Type)、组件(Component)、扩展(Extra)组成
Action属性用于描述Intent要完成的动作,对执行的动作进行一个简要描述
Data执行动作的URI和MIME类型
Category指明一个执行Action的分类
Component的属性用于指明Intent的目标组件的类的名称
Extra用于添加一些附加信息(可以利用该属性进行消息传递) --将信息存放到Extra属性有两种方式:一是直接将信息添加到Extra属性中,另一种是将数据封装到Bundle包中
显示Intent:
Inten intent=new Intent();
intent.setClass(Activity1.this,activity.class);
隐式通过Intent Filter过滤实现的
Extra属性
Intent intent=new Intent();
intent.putExtra("name","wanglibo");
意图实现跳转
MainActivity.java
public class MainActivity extends AppCompatActivity {
public void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_main);
Button btnjump=(Button)findViewById(R.id.jump);
btnjump.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
}
SecondActivity.java
public class SecondActivity extends Activity {
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button btn_back=(Button)findViewById(R.id.returnBack);
btn_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent myinten=new Intent();
myinten.setClass(SecondActivity.this,MainActivity.class);
startActivity(myinten);
SecondActivity.this.finish();
}
});
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="first activity"/>
<Button
android:id="@+id/jump"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转"
/>
</LinearLayout>
activity_second.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="second activity"/>
<Button
android:id="@+id/returnBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="返回"/>
</LinearLayout>
实现广播和接收Intent机制步骤:
1、注册相应广播接收器,广播接收器就是接收广播消息并对消息作出响应的组件
2、发送广播,将消息内容和用于过滤的信息封装起来,广播给广播接收器
3、满足条件的广播接收器执行接受方法onReceiver()
4、销毁广播接收器。
activity的sendBroadcast()、sendOrderBroadcast()、sendStrikyBroadcast()都可以广播Intent到广播接收器
Intent的过滤机制
Intent过滤器是用来通知系统它们能够处理哪种类型隐式的 Intent对象, Activity、Service、 Broadcast Receiver能够有一个或多个 Intent过滤器。每个过滤器都描述了组件的一种能力,说明了组件将会接受的 Intent对象集。它滤如有效的期望类型的 Intent对象,滤出不想要的 Intent对象。隐式的 Intent对象仅能发送给能够通过组件的一个过滤器来传递它的一组件
一个 Intent过滤器是 IntentFilter类的实例。 Intent过滤器通常都不是用Java代码来建立的,而是在应用程序的清单文件( AndroidManifest. xml)中用< -intent-filter>元素来声明。
过滤器有类似于 Intent对象的动作、数据、和分类的字段,过滤器会用这三个域来检测个隐式的 Intent对象。对于要传递给拥有过滤器的组件的 Intent对象,必须传递所有的这三个要检测的字段。如果其中之一失败了, Android系统也不会把它发送给对应的组件-至少在基于那个过滤器的基础上不会发送
Android广播机制指的是,可以通过实现广播接收器来监听和响应这些广播的Intent。
通常广播Intent用于向监听器通知系统给事件或应用程序事件,从而扩展应用程序间的事件驱动的编程模型。
广播Intent可以使应用程序更加开放,通过使用Intent来广播一个事件,可以在不用修改原始应用程序的情况下,对事件作出响应。
Android中大量使用广播Intent来广播系统事件,如电池电量、网络连接和来电。