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>
Manifest.xml


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 }
LoginActivity.java


这个时候的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 }
MainActivity.java


另外这个时候传递的参数使用的方法是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 }
MainActivity.java


    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>
Manifest.xml


当点击按钮的时候,系统会自动筛选合适的Activity,从而执行对应的程序。


隐式,即不是像显式的那样直接指定需要调用的Activity,隐式不明确指定启动哪个Activity,而是设置Action、Data、Category,让系统来筛选出合适的Activity。筛选是根据所有的<intent-filter>来筛选。


posted @ 2015-08-11 00:31  King_J  阅读(341)  评论(0编辑  收藏  举报