Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Intent 之系統Intent(一)

Intent 之系統Intent(一)

編輯:關於Android編程

前言:Android中的Intent中主要有兩種:即系統Intent和自定義Intent

系統Intent:

一,基本知識:

(1)解釋:意圖,意圖機制,是連接組件的管理者。

(2)Intent對象的基本構成:如:在下雨天,我喜歡吃肉,特別是雞肉

Action:表達動作,可通過Intent.setAction()設置,如例句中的:謂語--吃

常用的有: 常用於:

Intent.ACTION_WEB_SEARCH----浏覽器搜索;

new Intent(Intent.ACTION_VIEW , uri); //通過Intent.ACTION_VIEW來顯示此Uri的內容

Intent.ACTION_DIAL ---- 撥號界面

Intent.ACTION_CALL ---- 直接撥號

Intent.ACTION_SEND --- 發送,如短信,郵件等

Intent.ACTION_DELETE---- 刪除數據

Intent.ACTION_GET_CONTENT ----獲取內容,如圖庫

Intent.ACTION_VIEW:這個用的最多,功能很多,,具體略,

Data:做特指的賓語,如雞肉

設置方式:Intent.setData或Intent.setDataAndType

讀取方式:Intent.getData

常用URI表示:

file:///sdcard/a.data 代表本地sdcard下的a.data文件

content://com.duguhome.providers.a/1 代表數據源組件com.duguhome.providers.a中id為1的數據

http://baidu.com/a.data -- 代表baidu.com下的a.data文件

Type:泛指的賓語,如,肉

設置 :Intent.setType或Intent.setDataAndType

獲取 :Intent.getType()

 

   可以用通配符*表示,如,
	image/*----圖片;
	 image/jpg ---- jpg格式的圖片
	 text/plain  : 純文本
	 text/html  :  HTML文檔
	 text/*  :  text類型
	 video/mpeg  :  MPEG動畫
	 還有:(*/*)

 

注意:Data,Type誰後設置誰做主,若需一起做主人,則,需用setDataAndType()方法

Category :約束條件,如在下雨天,Intent.addCategory可為intent添加多個Category項,Intent.getCategories獲取

Component :目標組件,一旦使用了,則,intent對象變成只是負責傳遞信息的載體

Extras:Intent中數據傳輸的載體,按鍵值對存取,getExtras,setExtra方法

Flags:標志,如,設置為

Intent.FLAG_ACTIVITY_VIEW_NEW_TASK:組件將會嘗試去構造新的任務目標組件,而不是默認的原有組件,

Intent.setFlags ,Intent.addFlags方法

總之,一系列set方法和get方法,還有少數的add方法

 

二,使用:

例子(1):google搜索,根據URL調用浏覽器,電話撥打調用,發送短信彩信和郵件

(1)google搜索:

關鍵代碼:

 

//設置Intent對象的action為ACTION_WEB_SEARCH:代表通過Google浏覽器搜索
                    intent.setAction(Intent.ACTION_WEB_SEARCH);
                    //設置Intent對象的附加內容為SearchManager.QUERY :代表搜索關鍵字
                    intent.putExtra(SearchManager.QUERY , Et.getText().toString());
                    startActivity(intent);

(2)根據URL網址使用浏覽器:

 

 

   Uri uri = Uri.parse("http://" + url);       
   intent = new Intent(Intent.ACTION_VIEW , uri);  //通過Intent.ACTION_VIEW來顯示此Uri的內容
   startActivity(intent);
(3)電話撥打:

 

 

                        Uri uri = Uri.parse("tel:" + phonenum);
                        //intent  = new Intent(Intent.ACTION_CALL , uri);直接撥打
                        //下面是調到撥號界面
                        intent = new Intent(Intent.ACTION_DIAL,uri);
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);

 

(4)發送短信和彩信和郵件:

短信:

 

                        intent  =   new Intent(Intent.ACTION_VIEW) ;
                        intent.putExtra("sms_body" , msg);
                        intent.setType("vnd.android-dir/mms-sms");
                        startActivity(intent);

 


彩信:

 

              Uri uri =  Uri.parse("content://media/external/images/media/01");
                    Intent  intent  =   new Intent(Intent.ACTION_SEND);     //設置Action
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);         //添加Flags

                    intent.putExtra(Intent.EXTRA_STREAM , uri );       //設置intent的附件參數為之前的uri圖片
                    intent.putExtra("subject" , sub);           //分別設置主題,號碼,內容
                    intent.putExtra("address" , number);
                    intent.putExtra("sms_body" , msg);
                    intent.putExtra(Intent.EXTRA_TEXT , "通過彩信向你問好!");        //設置intent的彩信附加文字
                    intent.setType("image/*");      //彩信附件類型
                    //設置intent的彩信發送activity
                    intent.setClassName("com.android.mms" , "com.android.mms.ui.ComposeMessageActivity");
                    startActivity(intent);

郵件:

 

 

                   Intent  intent  =   new Intent(Intent.ACTION_SEND);     //設置Action
                   // intent.setType("text/plain"); 模擬器使用用這行
                    intent.setType("message/rfc822");
                    intent.putExtra(Intent.EXTRA_EMAIL , new String[]{email});  //email為郵箱地址
                    intent.putExtra(Intent.EXTRA_SUBJECT , sub);    //主題
                    intent.putExtra(Intent.EXTRA_TEXT , msg);       //內容
                    startActivity(Intent.createChooser(intent , "請選擇發送郵件的客戶端"));

完整代碼如下:

 

google搜索,根據URL調用浏覽器,電話撥打調用,發送短信代碼放在一起了:

布局文件:activity_first:4個EditText,4個按鈕,分別用於輸入和啟動

 




    
    
    
主類:FirstActivity,調用系統Intent去實現,代碼如下:

 

 

package testsdcard.com.maiyu.s05_092.activity;

import android.app.Activity;
import android.app.SearchManager;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import testsdcard.com.maiyu.s05_092.R;

/**
 * Created by maiyu on 2016/7/19.
 */
public class FirstActivity extends Activity {

    private EditText Et , Et2 , Et3 , Et4;
    private Button   Btn , Btn2 , Btn3 , Btn4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        findView();     //為控件綁定id
        setListener();  //設置監聽
    }

    //設置監聽器
    private void setListener() {
        Btn.setOnClickListener(mylistener);
        Btn2.setOnClickListener(mylistener);
        Btn3.setOnClickListener(mylistener);
        Btn4.setOnClickListener(mylistener);
    }

    //自定義監聽器
    View.OnClickListener  mylistener    =   new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent  intent  =   new Intent() ;
            switch (view.getId()){
                case R.id.Btn : //google搜索內容
                    //設置Intent對象的action為ACTION_WEB_SEARCH:代表通過Google浏覽器搜索
                    intent.setAction(Intent.ACTION_WEB_SEARCH);
                    //設置Intent對象的附加內容為SearchManager.QUERY :代表搜索關鍵字
                    intent.putExtra(SearchManager.QUERY , Et.getText().toString());
                    startActivity(intent);
                    break;
                case R.id.Btn2 :        //URL網址搜索
                    String  url  =  Et2.getText().toString();
                    if(!"".equals(url)){      //判斷輸入是否為空
                        Uri uri = Uri.parse("http://" + url);       //一般用戶輸入時不會加http://,然後通過處理網址生成Uri對象
                        intent = new Intent(Intent.ACTION_VIEW , uri);  //通過Intent.ACTION_VIEW來顯示此Uri的內容
                        startActivity(intent);
                    }else {
                        Toast.makeText(FirstActivity.this , "請輸入正確的URL網址" , Toast.LENGTH_SHORT).show();
                    }
                    break;
                case R.id.Btn3 :    //電話撥打
                    String phonenum =   Et3.getText().toString();
                    if(!"".equals(phonenum)){
                        Uri uri = Uri.parse("tel:" + phonenum);
                        //intent  = new Intent(Intent.ACTION_CALL , uri);直接撥打
                        //下面是調到撥號界面
                        intent = new Intent(Intent.ACTION_DIAL,uri);
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);
                    }else {
                        Toast.makeText(FirstActivity.this , "請輸入電話號碼",Toast.LENGTH_SHORT).show();
                    }
                    break;
                //短信分享內容
                case R.id.Btn4 :
                    String msg = Et4.getText().toString();
                    if(!"".equals(msg)){
                        intent  =   new Intent(Intent.ACTION_VIEW) ;
                        intent.putExtra("sms_body" , msg);
                        intent.setType("vnd.android-dir/mms-sms");
                        startActivity(intent);
                    }else{
                        Toast.makeText(FirstActivity.this, "請輸入要分享的短信內容...", Toast.LENGTH_SHORT).show();
                    }
                    break;
                default:
                    break;
            }
        }
    };

    //為各個控件綁定id
    private void findView() {
        Et      =   (EditText)findViewById(R.id.Et);
        Et2     =   (EditText)findViewById(R.id.Et2);
        Et3     =   (EditText)findViewById(R.id.Et3);
        Et4     =   (EditText)findViewById(R.id.Et4);
        Btn     =   (Button)findViewById(R.id.Btn);
        Btn2    =   (Button)findViewById(R.id.Btn2);
        Btn3    =   (Button)findViewById(R.id.Btn3);
        Btn4    =   (Button)findViewById(R.id.Btn4);
    }
}

添加權限:分別是:訪問網絡,撥打電話,發送短信,寫和創建和刪除sdcard文件,相機

 

 

    
    
    
    
    
    

結果:略,,,,

 

彩信和郵件完整代碼:

布局:三個EditText接受(彩信:電話號碼,主題,內容;郵件:郵箱,主題,內容,)一個啟動按鈕,內容相似,這裡

只給出彩信的布局:

 




    
    
    
    
    
    
    

彩信主類:

 

 

package testsdcard.com.maiyu.s05_092.activity;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import testsdcard.com.maiyu.s05_092.R;

/**
 * Created by maiyu on 2016/7/19.
 */
public class SecondActivity extends Activity {

    private Button btn ;        //定義按鈕控件
    private EditText EtMsg , EtNum , EtSub ;    //定義內容,號碼,主題
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        findView();     //為控件綁定id
        setListener();  //為控件設置監聽
    }

    //為控件設置監聽
    private void setListener() {
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //分別得到要發送的彩信的:內容,號碼,主題
                String  msg =   EtMsg.getText().toString();
                String  number  =   EtNum.getText().toString();
                String  sub =   EtSub.getText().toString();
                //判空
                if(!"".equals(msg) && !"".equals(number) && !"".equals(sub)){
                    //定義了用戶系統的1號圖片的uri,uri格式: "content://"、數據的路徑、標示ID(可選)
                    //通過DDMS,我們在/data/data/com.android.providers.media下找到數據庫文件
                    //打開external.db文件進一步查看:在media表格下,可以看到文件路徑(_data)和Uri的標示ID(_id)的對應關系。
                    Uri uri =  Uri.parse("content://media/external/images/media/01");
                    Intent  intent  =   new Intent(Intent.ACTION_SEND);     //設置Action
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);         //添加Flags

                    intent.putExtra(Intent.EXTRA_STREAM , uri );       //設置intent的附件參數為之前的uri圖片
                    intent.putExtra("subject" , sub);           //分別設置主題,號碼,內容
                    intent.putExtra("address" , number);
                    intent.putExtra("sms_body" , msg);
                    intent.putExtra(Intent.EXTRA_TEXT , "通過彩信向你問好!");        //設置intent的彩信附加文字
                    intent.setType("image/*");      //彩信附件類型
                    //設置intent的彩信發送activity
                    intent.setClassName("com.android.mms" , "com.android.mms.ui.ComposeMessageActivity");
                    startActivity(intent);
                }else {
                    Toast.makeText(SecondActivity.this , "彩信號碼或內容為空,,," ,Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    //為控件綁定id
    private void findView() {
        btn     =   (Button)findViewById(R.id.Btn);
        EtMsg   =   (EditText)findViewById(R.id.EtMsg);
        EtSub   =   (EditText)findViewById(R.id.EtSub);
        EtNum   =   (EditText)findViewById(R.id.EtNum);

    }
}

郵件主類:

 

 

package testsdcard.com.maiyu.s05_092.activity;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import testsdcard.com.maiyu.s05_092.R;

/**
 * Created by maiyu on 2016/7/19.
 */
public class ThirdActivity extends Activity {

    private Button btn ;        //定義按鈕控件
    private EditText EtMsg , EtEmail , EtSub ;    //定義內容,號碼,主題
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);
        findView();     //為控件綁定id
        setListener();  //為控件設置監聽
    }

    //為控件設置監聽
    private void setListener() {
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //分別得到要發送的彩信的:內容,號碼,主題
                String  msg =   EtMsg.getText().toString();
                String  email  =   EtEmail.getText().toString();
                String  sub =   EtSub.getText().toString();
                //判空
                if(!"".equals(msg) && !"".equals(email) && !"".equals(sub)){

                    Intent  intent  =   new Intent(Intent.ACTION_SEND);     //設置Action
                   // intent.setType("text/plain"); 模擬器使用用這行
                    intent.setType("message/rfc822");
                    intent.putExtra(Intent.EXTRA_EMAIL , new String[]{email});  //email為郵箱地址
                    intent.putExtra(Intent.EXTRA_SUBJECT , sub);    //主題
                    intent.putExtra(Intent.EXTRA_TEXT , msg);       //內容
                    startActivity(Intent.createChooser(intent , "請選擇發送郵件的客戶端"));
                }else {
                    Toast.makeText(ThirdActivity.this , "彩信號碼或內容或主題為空,,," ,Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    //為控件綁定id
    private void findView() {
        btn     =   (Button)findViewById(R.id.Btn);
        EtMsg   =   (EditText)findViewById(R.id.EtMsg);
        EtSub   =   (EditText)findViewById(R.id.EtSub);
        EtEmail   =   (EditText)findViewById(R.id.EtEmail);

    }
}

記得添加權限,和上面類似,,,

 

 

三,另一類例子:

(1)啟動播放音樂

 

                    intent    =   new Intent(Intent.ACTION_VIEW);   //設置action屬性為Intent.ACTION_VIEW
                    Uri uri = Uri.parse("file:///sdcard/五月天-溫柔.mp3");   //定義sdcard下的song.mp3文件的uri
                    intent.setDataAndType(uri , "audio/mp3");  //設置intent的數據類型為audio/mp3,
                    startActivity(intent);

(2)安裝卸載軟件:

 

 

                    //安裝應用
                    intent    =   new Intent(Intent.ACTION_VIEW);
                    intent.setDataAndType(Uri.parse("file://" + "/sdcard/XMNotes.apk") ,
                            "application/vnd.android.package-archive");
                    startActivity(intent);
                    //卸載應用
//                    Uri packageURI  = Uri.parse("package:指定的uri"); //要卸載的軟件的包名uri
//                    Intent uninstallIntent  =  new Intent(Intent.ACTION_DELETE);
//                    startActivity(uninstallIntent);

其他代碼都類似,就不列出,完整代碼在末尾可以下載,,,

 

(3)調用攝像機和打開圖庫和打開錄音:這裡用startActivityForResult(意圖對象,請求碼);

請求碼----requestCode:自己設置

請求結果----- resultCode :如若正確返回,則返回RESULT_OK

打開攝像機:

 

                    intent  =   new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(intent , 1);
在onActivityResult方法中:

 

 

        if(requestCode == 1){       //若果requestCode為1,
            if(resultCode == RESULT_OK){        //得到返回的處理狀態,成功得到照片返回RESULT_OK
                //取出data對象中的數據data的值,並化為Bitmap設置在Iv上
                Bitmap  bmPhoto  = (Bitmap)data.getExtras().get("data");
                Iv.setImageBitmap(bmPhoto);
            }
        }


打開圖庫:

 

 

                    intent  =   new Intent();
                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);
                    startActivityForResult(intent , 2);

在onActivityResult方法中:

 

 

        if(requestCode == 2){      //如果requestCode為2
            if(resultCode == RESULT_OK){    //返回處理結果成功
                Uri  uri  =  data.getData();    ///取得data對象中的數據
                //獲取當前activity的ContentResolver對象
                ContentResolver cr = this.getContentResolver();
                try{
                    //通過ContentResolver得到相應圖片並顯示出來
                    Bitmap bitmap  = BitmapFactory.decodeStream(cr.openInputStream(uri));
                    Iv.setImageBitmap(bitmap);
                }catch(FileNotFoundException e){
                    e.printStackTrace();
                }
            }
        }

打開錄音:

 

 

                    intent  =   new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
                    startActivityForResult(intent , 1);
在onActivityResult方法中:

 

 

 if(requestCode == 1){
            if(resultCode == RESULT_OK){
                //得到錄音的音頻文件及路徑
                String  dataFile = data.getDataString();
                String  dataUri  = getIntent().getDataString();
                Toast.makeText(FourActivity.this , "dataFile is "+dataFile + "dataUri is "+ dataUri,
                        Toast.LENGTH_SHORT).show();
            }
        }

打開錄音的完整代碼就忽略了,

 

打開相機和圖庫的完整代碼如下:

布局:

activity_five:一個imageView用於顯示,兩個按鈕用於啟動,即打開相機,打開圖庫

 




    
    
    
    
    


主類:FiveActivity,代碼如下:

 

 

package testsdcard.com.maiyu.s05_092.activity;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import java.io.FileNotFoundException;

import testsdcard.com.maiyu.s05_092.R;

/**
 * Created by maiyu on 2016/7/19.
 */
public class FiveActivity extends Activity {
    private Button  btn , btn2;        //按鈕,
    private TextView  Tv ;       //textView
    private ImageView Iv ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_five);
        findView();     //為控件綁定id
        setListener();  //為控件設置監聽
    }

    //為控件設置監聽
    private void setListener() {
        btn.setOnClickListener(mylistener);
        btn2.setOnClickListener(mylistener);
    }

    //自定義監聽器mylistener
    View.OnClickListener    mylistener  =   new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent  intent ;
            switch (view.getId()){
                case R.id.Btn :     //打開攝像機
                    intent  =   new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(intent , 1);
                    break;
                case R.id.Btn2 :    //打開圖庫
                    intent  =   new Intent();
                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);
                    startActivityForResult(intent , 2);
                    break;
                default:
                    break;
            }
        }
    };
    //為各個控件綁定id
    private void findView() {
        btn     =    (Button)findViewById(R.id.Btn);
        btn2    =    (Button)findViewById(R.id.Btn2);
        Tv      =    (TextView)findViewById(R.id.Tv);
        Iv      =    (ImageView)findViewById(R.id.Iv);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 1){       //若果requestCode為1,
            if(resultCode == RESULT_OK){        //得到返回的處理狀態,成功得到照片返回RESULT_OK
                //取出data對象中的數據data的值,並化為Bitmap設置在Iv上
                Bitmap  bmPhoto  = (Bitmap)data.getExtras().get("data");
                Iv.setImageBitmap(bmPhoto);
            }
        }
        else if(requestCode == 2){      //如果requestCode為2
            if(resultCode == RESULT_OK){    //返回處理結果成功
                Uri  uri  =  data.getData();    ///取得data對象中的數據
                //獲取當前activity的ContentResolver對象
                ContentResolver cr = this.getContentResolver();
                try{
                    //通過ContentResolver得到相應圖片並顯示出來
                    Bitmap bitmap  = BitmapFactory.decodeStream(cr.openInputStream(uri));
                    Iv.setImageBitmap(bitmap);
                }catch(FileNotFoundException e){
                    e.printStackTrace();
                }
            }
        }
    }
}
添加權限:

 

 

    
    
    
    
    
    


當然,系統intent作用還有很多,如打開聯系人,等等,,,
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved