学之广在于不倦,不倦在于固志。 ——晋·葛洪
(学问的渊博在于学习时不知道厌倦,而学习不知厌倦在于有坚定的目标)
001.Intent概念及用途:
译文“意图、意向”,是各组件之间交互的重要方式,是连接四大组件(Activity、Service、ContentProvider、BroadcastReceiver)之间的纽带,封装不同组件的通讯条件。
它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递信息,一般被用于启动活动、启动服务、发送广播
002.Intent的用法:
启动组件的方法:
组件名称 启动方法
Activity startActivity()/startActivityForResult()
Service startService()/bindService()
Broadcast sendBroadcast()/sendOrderBroadcast()/sendStickyBroadcast()
003.Intent的几个重要属性:
action:动作,data:数据,category:分类,type:类型,compent:组件,extra:扩展信息
a、action&category:
action一般和category成对出现,用于隐式启动时的精确匹配
清单文件:
<activity android:name=".SecondActivity"> <intent-filter> <action android:name="com.test.okamiy.myintent.ACTION"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
Activity:
public class MainActivity extends AppCompatActivity { private Button mButton; private static final String MY_ACTION = "com.test.okamiy.myintent.ACTION"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (Button) findViewById(R.id.bt); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /** * 隐式Intent启动跳转: * MY_ACTION:需要在清单文件中配置action,指明了当前活动可以响应 MY_ACTION这个 * action, * 此处没有添加Category,是因为系统默认添加了android.intent.category.DEFAULT * category精确指明当前活动能够响应的Intent中需要有匹配的 * * 注意:每个Intent中只能指定一个action,但却能指定多个category * */ Intent intent = new Intent(MY_ACTION); startActivity(intent); } }); } }
b、data和extras:
执行动作所要操作的数据和传递目标的附加信息
Activity:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //invokeWeb(); invokeWebSearch(); } /** * 打开指定的网页 Uri */ private void invokeWeb() { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("https://www.baidu.com/")); startActivity(intent); } /** * 进行关键字搜索 */ private void invokeWebSearch() { Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY, "github"); startActivity(intent); } }
c、type:
要执行动作的目标Activity所能处理的MIME数据类型
<data android:mimeType="image/*"/>
在使用Intent进行匹配时,我们可以使用setType(String type)或者setDataAndType(Uri data, String type)来设置mimeType
d、compent:
目标组件的包或类的名称
intent.setComponent(new ComponentName(getApplicationContext(), SecondActivity.class));
更多详情参见:参考文档--详细的参数讲解
004.其他的隐式Intent:
// 调用浏览器 Uri webViewUri = Uri.parse("http://blog.youkuaiyun.com/zuolongsnail"); Intent intent = new Intent(Intent.ACTION_VIEW, webViewUri); // 调用地图 Uri mapUri = Uri.parse("geo:100,100"); Intent intent = new Intent(Intent.ACTION_VIEW, mapUri); // 播放mp3 Uri playUri = Uri.parse("file:///sdcard/test.mp3"); Intent intent = new Intent(Intent.ACTION_VIEW, playUri); intent.setDataAndType(playUri, "audio/mp3"); // 调用拨打电话 Uri dialUri = Uri.parse("tel:10086"); Intent intent = new Intent(Intent.ACTION_DIAL, dialUri); // 直接拨打电话,需要加上权限<uses-permission id="android.permission.CALL_PHONE" /> Uri callUri = Uri.parse("tel:10086"); Intent intent = new Intent(Intent.ACTION_CALL, callUri); // 卸载应用 Uri uninstallUri = Uri.fromParts("package", "com.app.test", null); Intent intent = new Intent(Intent.ACTION_DELETE, uninstallUri); // 安装应用 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File("/sdcard/test.apk"), "application/vnd.android.package-archive");注意:有些需要添加权限
005.显式Intent的用法:
普通的启动活动:
/** * 普通显式意图启动活动 */ private void startActivity() { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); }
启动活动并传递参数
/** * 显式意图启动活动并传递参数 */ private void startActivity() { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("extra_data", "Hello SecondActivity!"); startActivity(intent); }
public class SecondActivity extends AppCompatActivity { private static final String TAG = "SecondActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Intent intent = getIntent(); String data= intent.getStringExtra("extra_data"); Log.i(TAG, "onCreate: "+data); } }com.test.okamiy.myintent I/SecondActivity: onCreate: Hello SecondActivity!
返回数据给上一个activity(重点):
启动活动,但是在启动的这个活动销毁的时候能够返回一个结果给上一个activity
MainActivity启动SecondActivity:
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private Button mButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (Button) findViewById(R.id.bt); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /** * startActivityForResult(intent,requestCode) * requestCode:请求码,用于标识数据来源 */ Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivityForResult(intent, 1); } }); startActivity(); } /** * 改方法在启动的活动被销毁的时候回调 * * @param requestCode 请求码 * @param resultCode 结果码:返回数据时传入的处理结果 * @param data 携带返回数据的Intent */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 1: if (resultCode == RESULT_OK) { String returnData = data.getStringExtra(SecondActivity.TAG); Log.i(TAG, "onActivityResult: "+returnData); } break; default: break; } }
SecondActivity:
public class SecondActivity extends AppCompatActivity { public static final String TAG = "SecondActivity"; private Button mButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); mButton = (Button) findViewById(R.id.bt_second); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra(TAG, "Hello MainActivity!!"); /** * 该方法用于向启动它的Activity返回数据 * 参数1:返回处理结果,一般使用RESULT_OK或者RESULT_CANCELED * 参数2:返回带有数据intent */ setResult(RESULT_OK, intent); finish(); } }); } }
如果点击返回键销毁则需要:
/** * 点击返回键销毁当前Activity */ @Override public void onBackPressed() { Intent intent = new Intent(); intent.putExtra(TAG, "Hello MainActivity!!"); setResult(RESULT_OK, intent); finish(); }
打印:
30138-30138/com.test.okamiy.myintent I/MainActivity: onActivityResult: Hello MainActivity!!
参考篇:点击打开链接