这样系统能够帮忙筛选出那些符合这个Intent的所有Activity,生成分享列表,呈现给用户。因为分享列表的信息是由系统过滤生成的,UI界面也是交给系统进行绘制的,我们的应用无法给这个分享列表设置点击监听器,那么如何才能实现添加一个“Copy to Clipboard”的选项到分享列表中,并在点击该选项之后执行对应的动作呢?当然,自己去实现这个分享列表的效果,UI完全交给自己的应用来控制,是可以轻松做到的,可是自己去过滤符合条件的应用,并绘制分享列表的代码量会大很多,实现起来更加复杂?下面介绍一个虽然写法有点奇怪却相对简便很多的方法。
实现步骤如下:
1)创建一个新的Intent
1234567891011121314151617
Intentintent=newIntent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_SUBJECT,title);intent.putExtra(Intent.EXTRA_TEXT,body);IntentclipboardIntent=newIntent("ACTION_COPY_TO_CLIPBOARD");clipboardIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);clipboardIntent.putExtra("KEY_SHARE_TITLE",title);clipboardIntent.putExtra("KEY_SHARE_BODY",body);try{IntentchooserIntent=Intent.createChooser(intent,"Share via");chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,newIntent[]{clipboardIntent});context.startActivity(chooserIntent);}catch(android.content.ActivityNotFoundExceptionex){Toast.makeText(context,"There are no share clients installed.",Toast.LENGTH_SHORT).show();}
请注意:Action与Flag。
2)在manifest文件中为当前的actiivty添加Intent Filter
123456789101112
<activityandroid:name=".TestActivity"android:label="Copy to clipboard"android:icon="@drawable/ic_action_copy"android:launchMode="singleTop"android:screenOrientation="portrait"android:windowSoftInputMode="adjustPan"><intent-filter><actionandroid:name="ACTION_COPY_TO_CLIPBOARD"/><categoryandroid:name="android.intent.category.DEFAULT"/></intent-filter></activity>
@OverrideprotectedvoidonNewIntent(Intentintent){super.onNewIntent(intent);Log.i(TAG,"[onNewIntent] intent = "+intent);if(intent!=null&&intent.getAction().equalsIgnoreCase("ACTION_COPY_TO_CLIPBOARD")){Stringtitle=intent.getStringExtra("KEY_SHARE_TITLE");Stringbody=intent.getStringExtra("KEY_SHARE_BODY");ClipboardManagerclipboard=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);// clipboard.setText(title + body);// Creates a new text clip to put on the clipboardClipDataclip=ClipData.newPlainText(title,body);clipboard.setPrimaryClip(clip);Log.d(TAG,"[onNewIntent] copy text title = "+title+", body = "+body);Toast.makeText(this,"Copy Succussed!",Toast.LENGTH_SHORT).show();}}