赞
踩
一、什么是Intent
1、Intent的概念:
Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。Intent这个英语单词的本意是“目的、意向、意图”。
Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。
activity、service和broadcast receiver之间是通过Intent进行通信的,而另外一个组件Content Provider本身就是一种通信机制,不需要通过Intent。我们来看下面这个图就知道了:
2、对于向这三种组件发送intent有不同的机制:
使用Context.startActivity() 或 Activity.startActivityForResult(),传入一个intent来启动一个activity。使用 Activity.setResult(),传入一个intent来从activity中返回结果。
将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service。将intent对象传给 Context.bindService()来绑定一个service。
将intent对象传给 Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则它们被传给 broadcast receiver。
二、Intent的相关属性:
Intent由以下各个组成部分:
component(组件):目的组件
action(动作):用来表现意图的行动
category(类别):用来表现动作的类别
data(数据):表示与动作要操纵的数据
type(数据类型):对于data范例的描写
extras(扩展信息):扩展信息
Flags(标志位):期望这个意图的运行模式
Intent类型分为显式Intent(直接类型)、隐式Intent(间接类型)。官方建议使用隐式Intent。上述属性中,component属性为直接类型,其他均为间接类型。
相比与显式Intent,隐式Intnet则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动。
Activity 中 Intent Filter 的匹配过程 :
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.ukulele.action.MY_ACTION"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<category android:name="android.intent.category.MY_CATEGORY"></category>
</intent-filter>
</activity>
<activity android:name=".ThirdActivity">
<intent-filter>
<action android:name="com.ukulele.action.MY_ACTION"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
<activity android:name=".FourthActivity">
<intent-filter android:priority="1">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" android:host="www.baidu.com"/>
</intent-filter>
</activity>
1.component(组件):目的组件
Intent intent = new Intent();
ComponentName componentName = new ComponentName(MainActivity.this,SecondActivity.class);
intent.setComponent(componentName);
startActivity(intent);
2.Action(动作):用来表现意图的行动
Intent intent = new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
startActivity(intent);
3.category(类别):用来表现动作的类别
同事匹配了两个活动
只有和中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应Intent。
Intent intent = new Intent(“com.ukulele.action.MY_ACTION”);
intent.addCategory(“android.intent.category.DEFAULT”);
startActivity(intent);
多添加一条类别Category 就明确了
每个Intent中只能指定一个action,但却能指定多个category;类别越多,动作越具体,意图越明确
Intent intent = new Intent(“com.ukulele.action.MY_ACTION”);
intent.addCategory(“android.intent.category.DEFAULT”);
intent.addCategory(“android.intent.category.MY_CATEGORY”);
startActivity(intent);
4.data(数据):表示与动作要操纵的数据
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri data = Uri.parse(“http://www.baidu.com“);
intent.setData(data);
startActivity(intent);
5.type(数据类型):对于data范例的描写
播放音乐
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse(“file:///storage/sdcard0/平凡之路.mp3”);
intent.setDataAndType(data,”audio/mp3”);
startActivity(intent);
播放视频
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse(“file:///storage/sdcard0/权力的游戏.mp4”);
intent.setDataAndType(uri,”video/mp4”);
startActivity(intent);
打开拨号界面,并指定电话
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse(“tel:10086”));
startActivity(intent);
直接拨打电话
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:10086”));
startActivity(intent);
打开发短信界面
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(“10086”),”vnd.android-dir/mms-sms”);
intent.putExtra(“sms_body”,”具体内容”);
startActivity(intent);
打开发短信界面2
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setData(Uri.parse(“10086”));
intent.putExtra(“sms_body”,”具体内容”);
startActivity(intent);
卸载app
Intent intent = new Intent(Intent.ACTION_DELETE);
intent.setData(Uri.parse(“package:com.example.xxx”));
startActivity(intent);
安装app
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.fromFile(new File(“/storage/sdcard0/AndroidTest.apk”));
intent.setDataAndType(data,”application/vnd.android.package-archive”);
startActivity(intent);
这个方法期望在活动销毁后返回一个结果给上一个活动
MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
//第一个参数是Intent 第二个参数是请求码
startActivityForResult(intent,1);
}
});
}
//第一个参数requestCode是启动活动时传入的请求码
//第二个参数resultCode返回数据传入的处理结果
//第三个参数data就是携带返回数据的Intent
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case 1:
if(requestCode == RESULT_OK){//RESULT_OK是1
String returnData = data.getStringExtra("data_return");
}
default:
break;
}
}
}
SecondActivity:
public class SecondActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
//如果用户在SecondActivity中并不是通过点击按钮,而是通过Back返回到MainActivity的,
//这样数据就没法返回了吧,所以用onBackPressed来解决这个问题
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return","Hello MainActivity");
setResult(RESULT_OK,intent);
finish();
}
}
启动活动的最佳方法:
FirstActivity:
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SecondActivity.actionStart(FirstActivity.this,"data");
}
});
}
}
SecondActivity:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
public static void actionStart(Context context, String data){
Intent intent = new Intent(context, SecondActivity.class);
intent.putExtra("param",data);
context.startActivity(intent);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。