Intent的使用
来源:互联网 发布:ubuntu mate 17.10 qq 编辑:程序博客网 时间:2024/05/29 03:51
一、什么是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);
startActivityForResult()
这个方法期望在活动销毁后返回一个结果给上一个活动
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); }}
- 学习Intent的使用
- Intent的使用
- Intent对象的使用
- 学习Intent的使用
- Intent的使用
- Intent-filter的使用
- android---Intent的使用
- intent filter的使用
- Intent意图的使用
- Intent的使用
- Intent 的使用
- Intent的使用
- intent 的使用
- 关于Intent的使用
- Intent的使用
- Android Intent的使用
- [Android]Intent的使用
- Intent的使用
- CF Bear and Tree Jumps树形DP
- php 生成随机字符串
- Python网络爬虫与信息提取-Day5-Requests库网络爬取实战
- MAC安装mysql过程详解
- java 反射案例
- Intent的使用
- C指针
- Xamarin版的C# SVG路径解析器
- java 基础语法
- 和为S的两个数字
- CCF 201512-2 消除类游戏
- jpeg 与 png 图片格式的区别
- 发现它,抓住它
- [PAT]1005. Spell It Right (20)@Java