Android中显示和隐式Intent的使用
显示启动activity
这个很简单,下面是代码示例:
为了看着方便,所以就把layout直接截图了,里面的代码只是一些简单的布局。
activity_login.xml:
activity_main.xml:
下面是Manifest.xml中的代码
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.bundle01" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk 8 android:minSdkVersion="8" 9 android:targetSdkVersion="21" /> 10 11 <application 12 android:allowBackup="true" 13 android:icon="@drawable/ic_launcher" 14 android:label="@string/app_name" 15 android:theme="@style/AppTheme" > 16 <activity 17 android:name=".LoginActivity" 18 android:label="@string/app_name" > 19 <intent-filter> 20 <action android:name="android.intent.action.MAIN" /> 21 22 <category android:name="android.intent.category.LAUNCHER" /> 23 </intent-filter> 24 </activity> 25 <activity 26 android:name=".MainActivity" 27 android:label="@string/title_activity_main" > 28 </activity> 29 </application> 30 31 </manifest>
LoginActivity.java中的代码:
1 package com.example.bundle01; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.Menu; 7 import android.view.MenuItem; 8 import android.view.View; 9 import android.view.View.OnClickListener; 10 import android.widget.EditText; 11 12 public class LoginActivity extends Activity { 13 EditText metId,metPwd; 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_login); 18 initView(); 19 setListener(); 20 } 21 private void setListener() { 22 setLoginListener(); 23 } 24 private void setLoginListener() { 25 findViewById(R.id.btnLogin).setOnClickListener(new OnClickListener() { 26 27 @Override 28 public void onClick(View v) { 29 String id = metId.getText().toString(); 30 String pwd = metPwd.getText().toString(); 31 32 Intent intent = new Intent(LoginActivity.this,MainActivity.class); 33 34 intent.putExtra("id", id); 35 intent.putExtra("pwd", pwd); 36 37 startActivity(intent); 38 } 39 }); 40 } 41 private void initView() { 42 metId = (EditText) findViewById(R.id.etName); 43 metPwd = (EditText) findViewById(R.id.etPassword); 44 } 45 }
这个时候的Intent就是显示调用,直接指定了接收参数的Activity,可以唯一确定一个Activity,意图特别明确,这个时候需要在MainActivity接收参数:
MainActivity中的代码:
1 package com.example.bundle01; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.util.Log; 7 import android.view.Menu; 8 import android.view.MenuItem; 9 import android.widget.Toast; 10 11 public class MainActivity extends Activity { 12 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 Intent intent = getIntent(); 19 20 Bundle date = intent.getExtras(); 21 String id = date.getString("id"); 22 String pwd = date.getString("pwd"); 23 24 Toast.makeText(this, "name = " + id + ", pwd = " + pwd, 4000).show(); 25 Log.i("main", "name = " + id + ", pwd = " + pwd); 26 } 27 }
另外这个时候传递的参数使用的方法是putExtra,如果传递的参数比较多可以使用Bundle类似于map。
隐式启动activity
原理:当启动另外一个Activity的时候,不是显式的指定activity名字,而是通过action或者category设置条件。比如,要卸载一个apk,就需要启动卸载界面,但是这个是android 系统写好的,相当于执行另外一个程序的activity,我们不知道另外一个程序中的activity的名字
跨程序的activity调用,必须启动隐式意图
在一个activity要实现一个预定义功能,或者在当前activity中不方便实现的功能,就只能调用别的activity来实现
预定义就是调用android系统写好的activity来实现我们想要实现的功能
怎么调用非当前activity或者非当前application的activity的功能呢?
1 找到要调用activity和操作的资源uri:统一资源定位和标示
2 要有操作这个资源的权限:<Manifest><use-permission>
3 要知道资源的数据类型,然后系统会自动调用相关程序来处理:MIME:大数据类型/小数据类型 audio/mp3
下面隐式启动activity
layout:全部都是<Button/>
MainActivity.java中代码:
1 package com.jaovo.day04_06; 2 3 import java.io.File; 4 5 import android.app.Activity; 6 import android.content.Intent; 7 import android.net.Uri; 8 import android.os.Bundle; 9 import android.os.Environment; 10 import android.util.Log; 11 import android.view.Menu; 12 import android.view.MenuItem; 13 import android.view.View; 14 import android.view.View.OnClickListener; 15 16 public class MainActivity extends Activity implements OnClickListener { 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 setListener(); 23 } 24 25 private void setListener() { 26 findViewById(R.id.btnBrowser).setOnClickListener(this); 27 findViewById(R.id.btnCall).setOnClickListener(this); 28 findViewById(R.id.btnDial).setOnClickListener(this); 29 findViewById(R.id.btnInstall).setOnClickListener(this); 30 findViewById(R.id.btnPlayMusic).setOnClickListener(this); 31 findViewById(R.id.btnSendSms).setOnClickListener(this); 32 findViewById(R.id.btnStartSecondActivity).setOnClickListener(this); 33 findViewById(R.id.btnUninstall).setOnClickListener(this); 34 } 35 36 @Override 37 public void onClick(View v) { 38 Intent intent = null; 39 switch (v.getId()) { 40 case R.id.btnStartSecondActivity: 41 intent = new Intent("com.jaovo.day04_06.SecondActivity"); 42 break; 43 case R.id.btnBrowser: 44 intent = new Intent(Intent.ACTION_VIEW); 45 // 这里setData的数据通过Uri定位到一个远程服务器上的php页面资源. 46 // setData,给intent的mData成员变量赋值,并且,可以自动判定传入数据的数据类型 47 // 这里就会自动判定,传入的是一个远程的URL地址. 48 // 所以android系统会自动调用浏览器来访问 49 intent.setData(Uri.parse("http://www.jaovo.com/index.php")); 50 break; 51 case R.id.btnCall: // 需要注册权限,打电话是敏感操作 52 // mData成员变量,在intent中表示某个资源对象. 53 // android中资源对象怎么表示和定位:Uri定位和表示一个字符串类型对象的地址 54 // Uri是一个资源定位符,通过资源定位符找到要操作的对象 55 intent = new Intent(Intent.ACTION_CALL);// 也有指定类型的意思 56 // 这是只是告诉intent要匹配什么样子的activity 57 intent.setData(Uri.parse("tel:10010")); 58 break; 59 case R.id.btnDial: 60 intent = new Intent(Intent.ACTION_DIAL); 61 intent.setData(Uri.parse("tel:188690")); 62 break; 63 case R.id.btnInstall:{ 64 // 4.3之前,外部存储卡是在/mnt,4.4/storeage/sdcard 65 File dir = Environment 66 .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 67 68 // 代表内存中一个文件对象 69 File file = new File(dir, "baidu_safe.apk"); 70 intent = new Intent(Intent.ACTION_VIEW); 71 // 第二个参数是固定的,说明这是一个android压缩包格式,apk 72 intent.setDataAndType(Uri.fromFile(file), 73 "application/vnd.android.package-archive"); 74 } 75 break; 76 77 case R.id.btnPlayMusic: //播放音乐 78 intent = new Intent(Intent.ACTION_VIEW); 79 File dir = Environment 80 .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 81 File file = new File(dir, "xqg.mp3"); 82 intent.setDataAndType(Uri.fromFile(file), "audio/mp3"); 83 break; 84 case R.id.btnSendSms: 85 intent = new Intent(Intent.ACTION_SENDTO); 86 //格式固定不变 87 intent.setData(Uri.parse("smsto:1245432324")); 88 intent.putExtra("sms_body", "hello Android"); 89 break; 90 case R.id.btnUninstall: 91 intent = new Intent(Intent.ACTION_DELETE); 92 //只需要包名即可,不需要程序名 93 intent.setData(Uri.parse("package:"+"com.jaovo.day04_05")); 94 break; 95 96 } 97 startActivity(intent);// 这一句必须得有 98 } 99 }
Manifest.xml中的代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <!-- 4 命名的关键:唯一性.包域名保证唯一性. 5 在android中,有一个很重要的概念:资源(文件,不光是文件,还可以表示你某个文件当中可调用的内容) 6 通过一个URL为了表示这些的资源的唯一性,我们通过URL的形式来唯一的表示某一个资源 7 --> 8 9 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 10 package="com.jaovo.day04_06" 11 android:versionCode="1" 12 android:versionName="1.0" > 13 14 <uses-sdk 15 android:minSdkVersion="8" 16 android:targetSdkVersion="21" /> 17 18 <uses-permission android:name="android.permission.INTERNET" /> 19 <uses-permission android:name="android.permission.CALL_PHONE" /> 20 21 <application 22 android:allowBackup="true" 23 android:icon="@drawable/ic_launcher" 24 android:label="@string/app_name" 25 android:theme="@style/AppTheme" > 26 27 <activity 28 android:name=".MainActivity" 29 android:label="@string/app_name" > 30 <intent-filter> 31 <action android:name="android.intent.action.MAIN" /> 32 33 <category android:name="android.intent.category.LAUNCHER" /> 34 </intent-filter> 35 </activity> 36 37 <activity 38 android:name=".SecondActivity" 39 android:label="@string/title_activity_second" > 40 <intent-filter> 41 <action android:name="com.jaovo.day04_06.SecondActivity" /> 42 43 <category android:name="android.intent.category.DEFAULT" /> 44 </intent-filter> 45 </activity> 46 </application> 47 48 </manifest>
当点击按钮的时候,系统会自动筛选合适的Activity,从而执行对应的程序。
隐式,即不是像显式的那样直接指定需要调用的Activity,隐式不明确指定启动哪个Activity,而是设置Action、Data、Category,让系统来筛选出合适的Activity。筛选是根据所有的<intent-filter>来筛选。