Android利用intent實現分享功能

2021-09-02 05:30:14 字數 3856 閱讀 3881

在構建乙個intent時,必須指定這個intent需要觸發的action。android定義了一些actions,比如action_send,該action表明該intent用於從乙個activity傳送資料到另外乙個activity的,甚至可以是跨程序的資料傳送。

為了傳送資料到另乙個activity,我們只需要指定資料和資料的型別,系統就會自動識出能夠接收這些資料型別的activity。如果選擇有多個,就會把這些activity顯示給使用者進行選擇;如果只有乙個,則立即啟動該activity。

下面列出乙個簡單的分享方式

intent intent = new intent();

intent.setaction(intent.action_send);

intent.putextra(intent.extra_text,"文字分享");

intent.settype("text/plain");

startactivity(intent);

putextra()方法中放入的是分享的內容;

settype()設定分享的型別;

利用這樣的分享方式進行分享時,會出現乙個設定預設的選擇,選定後,系統預設此型別的分享內容一直使用選定的程式進行,這樣顯然不符合我們的分享需求。我們可以使用下面的方法:

intent intent = new intent();

intent.setaction(intent.action_send);

intent.putextra(intent.extra_text,"文字分享");

intent.settype("text/plain");

startactivity(intent.createchooser(intent,"選擇分享應用"));

呼叫intent.createchooser()這個方法,此時即使使用者之前為這個intent設定了預設,選擇介面還是會顯示,並且我們可以指定選擇介面的標題。

uri uri = uri.parse("file://" + image.getimagepath());

intent intent = new intent();

intent.setaction(intent.action_send);

intent.putextra(intent.extra_stream, uri);

intent.settype("image/*");

startactivity(intent.createchooser(intent, "選擇分享應用"));

settype()方法根據要分享的內容的型別,還可以有「audio/mp4a-latm」、「audio/x-mpeg」、 「video/mp4」…很多態別。

通過上面的設定,我們會發現,系統彈出了很多方式,包括郵件、簡訊、藍芽之類的,有些應用我們不希望顯示出來,我們就可以使用以下方法:

uri uri = uri.parse("file://" + image.getimagepath());

intent intent = new intent();

intent.setaction(intent.action_send);

intent.putextra(intent.extra_stream, uri);

intent.settype("image/*");

intent.setflags(intent.flag_activity_new_task);

intent.addflags(intent.flag_grant_read_uri_permission);

packagemanager  pm = getpackagemanager();

listresinfo = pm.queryintentactivities(intent,0);

if(resinfo.isempty())

在進行篩選時,需要注意的一點是settype()方法是必須設定的,不然的話不能跳轉到選擇的應用。

listtargetintents = new arraylist<>();

for (resolveinfo resolveinfo : resinfo)

intent target = new intent();

target.setaction(intent.action_send);

target.setcomponent(new componentname(activityinfo.packagename,activityinfo.name));

target.putextra(intent.extra_stream, uri);

target.settype("image/*");//必須設定,否則選定分享型別後不能跳轉介面

targetintents.add(new labeledintent(target,activityinfo.packagename,resolveinfo.loadlabel(pm),resolveinfo.icon));}}

if (targetintents.size()<= 0)

4、最後呼叫createchooser方法,顯示分享dialog

intent chooser = intent.createchooser(targetintents.remove(targetintents.size() - 1), "選擇分享");

if (chooser == null) return;

labeledintent labeledintents = targetintents.toarray(new labeledintent[targetintents.size()]);

chooser.putextra(intent.extra_initial_intents,labeledintents);

startactivity(chooser);

createchooser()方法最終展示給使用者的選擇包括,符合createchooser第乙個引數的應用以及由extra_intent_intents指定的應用。

效果圖如下:

1.效果圖

上述方法都是對單個的分享,如果我們想要一次分享多張,要怎麼做呢?其實很簡單,只需要把多張的uri裝進乙個集合裡,並將action設定為action_send_multiple多個檔案傳送模式,並把uri集合傳入即可,**如下所示:

arraylistmylist = new arraylist<>();

intent target = new intent();

target.setaction(intent.action_send_multiple);

target.putparcelablearraylistextra(intent.extra_stream, mylist);

target.settype("image/*");

startactivity(intent.createchooser(target,"選擇分享"));

上述**中沒有對分享應用進行過濾,如果需要進行過濾,可以參考第三小節進行。

最後呢,總結一下利用android原生實現分享和利用第三方sdk實現的優缺點,如下表中所示:

分享型別

優勢劣勢

原生分享

第三方sdk

if(version.sdk_int >= 24)

Android 利用intent啟動瀏覽器

需要設定action和date屬性。構造 uri uri uri.parse intent intent newintent intent.action view,uri startactivity intent 分開 uri uri uri.parse intent intent newinten...

利用Intent切換Activity

在主activity中敲入 intent it newintent mainactivity.this,otheractivity.class 將資料傳給新的 activity,如果不傳資料,只是簡單的跳轉,這幾行 可以注釋掉 bundle bundle newbundle bundle.putst...

Android基礎 intent詳解

intent 意圖 用於activity之間的資料傳遞以及activity之間的切換 這兩者都可以在乙個應用多個activity之間實現,同樣也適用於不同應用間的activity。同乙個應用的實現和不同應用間的實現區別在於後者需要通過action和category實現,而前者可以通過action和為...