国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

android系統分享的自定義功能的示例代碼

2019-10-22 18:30:10
字體:
來源:轉載
供稿:網友

分享功能是app中特別常見的功能,國內的app基本都支持分享到微信 QQ等主流的社交應用。至于分享功能的實現大多是使用第三方的share sdk一步到位,或者分享的app比較少比如就一個微信 那通常使用微信sdk的分享模塊即可。但其實android系統就給我們提供過一種分享的實現方式,代碼也比較簡單如下

    Intent share = new Intent(Intent.ACTION_SEND);    share.setType("text/plain");    share.putExtra(Intent.EXTRA_TEXT, shareText);    share.putExtra(Intent.EXTRA_SUBJECT, shareSubject);    if (uri != null) {      share.setType("image/*");      share.putExtra(Intent.EXTRA_STREAM, uri);    }    context.startActivity(Intent.createChooser(share, title));

android分享功能,android系統分享功能,android,自帶分享功能

系統提供的短短不到十行代碼,將分享列表 數據 展示 點擊 跳轉 跳轉后分享內容的分享等一系列動作都集合完成了。這樣確實給人干凈利索的感覺,但隨之問題也來了比如我分享列表中只有特定幾個app,甚至把某個app放在第一個,還有點擊Facebook的分享后分享方式我想用facebooksdk自帶的,等等一些列自定義功能完成就比較麻煩。

對個別app的分享特別處理

從以上的代碼可以看出,google官方定義出分享的key value一一對應規則。比如Intent.EXTRA_STREAM對應為分享圖片的uri,Intent.EXTRA_TEXT對應為分享的text文本。從道理上講如果分享到的app都遵循google定義的這規則我們就能通過官方這代碼實現分享到所有app的功能。然而理想很豐滿現實很骨感,比如我們項目中要求分享到的facebook就壓根不遵守這規則,我們想實現分享到Facebook就必須用其sdk實現。于是我們就需要在分享列表中點擊Facebook是單獨走Facebook的分享邏輯。

  • 常規思維這是一個列表,我們監聽列表item的點擊事件即可,然而從實現該分享列表的代碼 可以看出沒有類似listview recyclerview控件,也沒有adapter,扒了下源碼和google找不到item的點擊事件的監聽,故該方案放棄了
  • 所以只能采用了自己實現分享列表,然后監聽分享列表item點擊事件單獨處理的方式,也是符合常規思路

第一步:獲取分享列表的數據

 

    private static List<List<ResolveInfo>> getShareActivities() {    Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);    sharingIntent.setType("text/plain");    PackageManager pm = App.getInstance().getPackageManager();    List<List<ResolveInfo>> listArrayList = new ArrayList<>();    List<ResolveInfo> activityList = pm.queryIntentActivities(sharingIntent, 0);    List<ResolveInfo> newActivityList = new ArrayList<>();    for (Iterator<ResolveInfo> it = activityList.iterator(); it.hasNext(); ) {      ResolveInfo info = it.next();      //過濾出facebook google+ whatapp twitter 分享app單獨處理      LogUtils.e("+++", info.activityInfo.packageName);      if (info.activityInfo.packageName.equals("com.android.bluetooth") || info.activityInfo.packageName.equals("com.android.nfc") || info.activityInfo.packageName.equals("com.facebook.katana") || info.activityInfo.packageName.equals("com.google.android.apps.plus") || info.activityInfo.packageName.equals("com.facebook.orca") || info.activityInfo.packageName.contains("whatsapp") || info.activityInfo.packageName.equals("com.twitter.android")) {        if (info.activityInfo.packageName.equals("com.android.bluetooth") || info.activityInfo.packageName.equals("com.android.nfc")) {          it.remove();        } else {          newActivityList.add(info);          it.remove();        }      }    }    //增加一條other數據    newActivityList.add(null);    listArrayList.add(newActivityList);    listArrayList.add(activityList);    return listArrayList;  }

第二步:構建分享的列表,且定義點擊事件等

public static void systemShareDialog(List<ResolveInfo> packages, Context context, String title, String shareText) {    List<Intent> targetIntents = new ArrayList<Intent>();    Intent shareIntent = new Intent(Intent.ACTION_SEND);    shareIntent.setType("text/plain");    SPM spm = new SPM();    for (ResolveInfo candidate : packages) {      String packageName = candidate.activityInfo.packageName;      Intent target = new Intent(android.content.Intent.ACTION_SEND);      target.setType("text/plain");      target.putExtra(Intent.EXTRA_TEXT, shareText);      //target.setPackage(packageName);      //t will be able to handle the case of multiple activities within the same app that can handle this intent. Otherwise, a weird item of "Android System" will be shown      target.setComponent(new ComponentName(packageName, candidate.activityInfo.name));      targetIntents.add(target);    }//    createchooser時使用targetIntents.remove(0)即傳入targetIntents的第一個intent,并將其移除,////    否則執行chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[] {}));添加后啟動時會出現兩個相同的應用    Intent chooserIntent = Intent.createChooser(targetIntents.remove(0), title);    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[]{}));    context.startActivity(chooserIntent);  }

總結

至此完成了基于android系統提供的分享方式上的擴展改造,自定義分享列表數據展示 自定義點擊后的分享形式等等都可以實現。。其實此功能中Intent.createChooser所做工作還是蠻多的,有興趣童鞋可以再去扒下起源碼,看具體實現和到底做了哪些工作。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 若羌县| 吉林市| 泰兴市| 永城市| 潞城市| 沁水县| 尉犁县| 桓台县| 乌鲁木齐县| 长丰县| 滨州市| 巴马| 蛟河市| 苗栗县| 阜阳市| 安徽省| 舟山市| 河间市| 海原县| 舟曲县| 区。| 许昌县| 莲花县| 共和县| 布拖县| 株洲市| 肃南| 靖边县| 高清| 穆棱市| 天门市| 阳城县| 抚宁县| 黄山市| 江山市| 凌海市| 思茅市| 盘山县| 盘山县| 翁牛特旗| 双城市|