更多隱式Intent的用法

使用Intent啟動(dòng)系統(tǒng)內(nèi)的程序

使用隱式Intent印叁,不僅可以啟動(dòng)自己程序內(nèi)的活動(dòng)菜皂,還可以啟動(dòng)其他程序中的活動(dòng)协饲。

舉個(gè)例子,這里在當(dāng)前Activity中通過(guò)Intent啟動(dòng)系統(tǒng)的瀏覽器來(lái)打開網(wǎng)頁(yè)乘凸,其關(guān)鍵代碼如下:

public class MainActivity extends Activity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse("http://www.baidu.com"));
            startActivity(intent);
        }
    });
}
}

啟動(dòng)程序會(huì)發(fā)現(xiàn)程序打開了系統(tǒng)瀏覽器,并且打開了百度的首頁(yè)累榜,如下圖所示营勤,這是為什么呢灵嫌?首先,上面程序中指定了Intent的action為Intent.ACTION_VIEW葛作,這是一個(gè)Android系統(tǒng)內(nèi)置的動(dòng)作寿羞,其常量值為android.intent.action.VIEW,然后通過(guò)Uri.parse()方法赂蠢,將一個(gè)網(wǎng)址字符串解析成一個(gè)Uri對(duì)象绪穆,再調(diào)用Intent的setData()方法將這個(gè)Uri對(duì)象傳遞進(jìn)去。

IntentDemo2.png

與此對(duì)應(yīng)虱岂,我們還可以在<intent-filter>中再配置一個(gè)<data>標(biāo)簽玖院,用于更精確的指定當(dāng)前活動(dòng)可以響應(yīng)什么類型的數(shù)據(jù)。只有<data>標(biāo)簽中的內(nèi)容與Intent中攜帶的Data完全一致時(shí)第岖,當(dāng)前活動(dòng)才能響應(yīng)Intent难菌,不過(guò)在<data>標(biāo)簽中不會(huì)指定過(guò)多的內(nèi)容,如上面的瀏覽器中蔑滓,其實(shí)只需要指定android:scheme為http郊酒,就可以響應(yīng)http協(xié)議的Intent了。

使用Intent向下一個(gè)活動(dòng)傳遞數(shù)據(jù)

Intent提供了一系列putExtra()方法的重載键袱,可以把數(shù)據(jù)暫存在Intent中燎窘,啟動(dòng)另一個(gè)Activity后,只需要把數(shù)據(jù)從Intent讀出來(lái)就可以了杠纵,例如我們可以把一個(gè)字符串從一個(gè)Activity中傳遞到另一個(gè)Activity中:

button1.setOnClickListener(new View.OnClickListener() {   

   public void onClick(View v) {        
   String data = "Hello SecondActivity";        
   Intent intent = new Intent(FirstActivity.this, 

   SecondActivity.class);       
   intent.putExtra("extra_data", data);        

   startActivity(intent);   
   }
});

這里通過(guò)顯式Intent啟動(dòng)SecondActivity荠耽,并通過(guò)putExtra()方法傳遞了一個(gè)字符串。注意這里 putExtra()方法接收兩個(gè)參數(shù)比藻,第一個(gè)參數(shù)是鍵铝量,用于后面從 Intent中取值,第二個(gè)參數(shù)才是真正要傳遞的數(shù)據(jù)银亲。

我們?cè)诘诙€(gè)Activity中可以將第一個(gè)Activity傳入的數(shù)據(jù)取出慢叨,代碼如下:

public class SecondActivity extends AppCompatActivity {      

private TextView textView;   
@Override   
protected void  onCreate(Bundle savedInstanceState) {       
      super.onCreate(savedInstanceState);    
      requestWindowFeature(Window.FEATURE_NO_TITLE);     
      setContentView(R.layout.second_layout);       
      textView = (TextView) findViewById(R.id.textView);     
      Intent intent = getIntent();        
      String data = intent.getStringExtra("extra_data");     

      textView.setText(data);    
  }
}

上述代碼中通過(guò)getIntent方法獲得啟動(dòng)SecondActivity的Intent,然后調(diào)用getStringExtra()方法务蝠,傳入相應(yīng)的鍵值來(lái)獲得相應(yīng)的數(shù)據(jù)拍谐。

返回?cái)?shù)據(jù)給上一個(gè)活動(dòng)

Activity中可以通過(guò)startActivityForResult()方法來(lái)啟動(dòng)Activity,但是這個(gè)方法期望在活動(dòng)銷毀的時(shí)候返回一個(gè)結(jié)果給上一個(gè)活動(dòng)馏段。

startActivity()方法需要兩個(gè)參數(shù)轩拨,第一個(gè)參數(shù)還是Intent,而第二個(gè)參數(shù)則表示請(qǐng)求碼院喜,用于在之后的回調(diào)中判斷數(shù)據(jù)的來(lái)源亡蓉,startActivity()的使用方法如下:

首先,在MainActivity中使用startActivityForResult()方法啟動(dòng)SecondActivity喷舀,代碼如下:

public class MainActivity extends AppCompatActivity { 
        private Button button1;  
        @Override   
        protected void onCreate(Bundle savedInstanceState) { 
                super.onCreate(savedInstanceState);     
                setContentView(R.layout.activity_main);        
                button1 = (Button) findViewById(R.id.button1);
                button1.setOnClickListener(new View.OnClickListener() {              
                @Override           
                        public void onClick(View v) {    
                        Intent intent = new Intent(MainActivity.this,   
                        SecondActivity.class);  
                        startActivityForResult(intent, 1);    
                }        
        });    
    }
}

緊接著砍濒,我們?cè)赟econdActivity中又創(chuàng)建了一個(gè)Intent淋肾,不過(guò)這個(gè)Intent僅僅用來(lái)傳遞數(shù)據(jù),把想要傳遞的數(shù)據(jù)放入Intent中之后爸邢,調(diào)用setResult()方法用來(lái)向上一個(gè)活動(dòng)返回?cái)?shù)據(jù)樊卓,setResult()方法接收兩個(gè)參數(shù) ,第 一個(gè) 參數(shù) 用于 向上一 個(gè)活 動(dòng)返 回處 理結(jié)果 杠河,一 般只 使用 RESULT_OK 或RESULT_CANCELED 這兩個(gè)值碌尔,第二個(gè)參數(shù)則是把帶有數(shù)據(jù)的 Intent 傳遞回去,然后調(diào)用了 finish()方法來(lái)銷毀當(dāng)前活動(dòng)感猛,這部分代碼如下:

public class SecondActivity extends AppCompatActivity {     
        @Override   
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);          
      
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.second_layout);       
        Button button2 = (Button) findViewById(R.id.button2); 
        button2.setOnClickListener(new View.OnClickListener() {              
                @Override            
                public void onClick(View v) {               
                        Intent intent = new Intent();     
                        intent.putExtra("data_return", "Hello MainActivity");                
                        setResult(RESULT_OK, intent);       
                        finish();           
                 }        
        });   
     }
 }

由于我們是使用startActivityForResult()方法來(lái)啟動(dòng)SecondActivity的七扰,在SecondActivity被銷毀之后會(huì)回調(diào)上一個(gè)Activity的onActivityResult()方法,因此需要在第一個(gè)活動(dòng)中重寫這個(gè)方法陪白,代碼如下:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {    
        switch (requestCode) {        
            case 1:           
                if(resultCode == RESULT_OK) {                
                    String returnedData = data.getStringExtra("data_return"); 
                    Log.d("MainActivity", returnedData);          
                }           
                break;        
            default:    
         }
 }

整個(gè)程序的運(yùn)行結(jié)果如下圖:

捕獲.PNG

總結(jié):

  1. 使用Intent可以啟動(dòng)啟動(dòng)系統(tǒng)內(nèi)的程序颈走,此時(shí)在新建Intent的時(shí)候往往給Intent傳入一個(gè)參數(shù)action,例如Intent.ACTION_VIEW咱士,該參數(shù)表示一個(gè)查看動(dòng)作立由,例如查看網(wǎng)頁(yè)等等,創(chuàng)建完成之后可以使用Intent的setData()方法將一個(gè)網(wǎng)址字符串通過(guò)Uri.prase()方法將網(wǎng)址字符串解析成一個(gè)Uri對(duì)象序厉;

  2. 可以使用Intent的putExtra()方法傳遞數(shù)據(jù)锐膜,該方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)是鍵弛房,用于后面從Intent中取值道盏,第二個(gè)參數(shù)是希望通過(guò)Intent傳遞的數(shù)據(jù);

3.在Intent啟動(dòng)的Activity中通過(guò)getIntent()方法可以獲得啟動(dòng)這個(gè)Activity的Intent文捶,然后調(diào)用getStringExtra()結(jié)合鍵值就可以得到傳遞的數(shù)據(jù)荷逞,當(dāng)然此類方法還有很多,例如getIntExtra()等等粹排;

4.Intent還可以用來(lái)返回?cái)?shù)據(jù)給上一個(gè)Activity种远,此時(shí)在啟動(dòng)另一個(gè)Activity時(shí)使用startActivityForResult()方法,在另一個(gè)Activity中創(chuàng)建一個(gè)新的Intent顽耳,并綁定相應(yīng)的數(shù)據(jù)后通過(guò)setResult()方法返回?cái)?shù)據(jù)坠敷,在另一個(gè)Activity被銷毀之后會(huì)回調(diào)原來(lái)Activity中的onActivityResult()方法,在該方法中進(jìn)行相應(yīng)的處理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末射富,一起剝皮案震驚了整個(gè)濱河市膝迎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胰耗,老刑警劉巖弄抬,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宪郊,居然都是意外死亡掂恕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門弛槐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)懊亡,“玉大人,你說(shuō)我怎么就攤上這事乎串〉暝妫” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵叹誉,是天一觀的道長(zhǎng)鸯两。 經(jīng)常有香客問(wèn)我,道長(zhǎng)长豁,這世上最難降的妖魔是什么钧唐? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮匠襟,結(jié)果婚禮上钝侠,老公的妹妹穿的比我還像新娘。我一直安慰自己酸舍,他們只是感情好帅韧,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啃勉,像睡著了一般忽舟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淮阐,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天叮阅,我揣著相機(jī)與錄音,去河邊找鬼枝嘶。 笑死帘饶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的群扶。 我是一名探鬼主播及刻,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼竞阐!你這毒婦竟也來(lái)了缴饭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤骆莹,失蹤者是張志新(化名)和其女友劉穎颗搂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幕垦,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丢氢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年傅联,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疚察。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒸走,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出貌嫡,到底是詐尸還是另有隱情比驻,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布岛抄,位于F島的核電站别惦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏夫椭。R本人自食惡果不足惜掸掸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望益楼。 院中可真熱鬧猾漫,春花似錦、人聲如沸感凤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)陪竿。三九已至禽翼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間族跛,已是汗流浹背闰挡。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留礁哄,地道東北人长酗。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像桐绒,于是被迫代替她去往敵國(guó)和親夺脾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程茉继,因...
    小菜c閱讀 6,444評(píng)論 0 17
  • 三十而立咧叭,四十不惑,五十知命烁竭,六十花甲菲茬,七十古來(lái)稀。到了五十歲,該經(jīng)歷得也經(jīng)歷過(guò)婉弹,該看過(guò)得也都看過(guò)睬魂。人生在世,該懂...
    沙漠里的一抹綠閱讀 363評(píng)論 0 0
  • 在每個(gè)令人慚愧的歡樂時(shí)間過(guò)程中马胧,他的其實(shí)內(nèi)心是極其復(fù)雜崩潰的汉买,其實(shí)心中最大的愧莫過(guò)于父母,但每每電話之中卻因難以忍...
    舊子衿閱讀 697評(píng)論 0 0