Launcher源碼中Intent.createChooser()實現原理及小例子

來源:互聯網
上載者:User
 在上一篇中,簡單的分析了一下原始碼,在
final Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER);        Intent chooser = Intent.createChooser(pickWallpaper,                getText(R.string.chooser_wallpaper));

處百思不得其解,後來在網上找,也沒有很透徹的解釋。先看下它的官方文檔吧:

public static Intent createChooser (Intent target, CharSequence title)Since: API Level 1Convenience function for creating a ACTION_CHOOSER Intent.Parameterstarget The Intent that the user will be selecting an activity to perform.title Optional title that will be displayed in the chooser.Returns    * Return a new Intent object that you can hand to Context.startActivity() and related methods. 

在google上面也找了下,慢慢的有些明白,在一篇文章中看到這麼一段話:

這裡是要找到所有能處理Intent.ACTION_SET_WALLPAPER請求的activity,其字串表示為android.intent.action.SET_WALLPAPER。使用Eclipse搜尋之後,在以下應用的AndroidManifest.xml檔案都找到了能處理這個請求的activity:
packages/apps/Gallery
packages/apps/Launcher2
packages/wallpapers/LivePicker
再看看下面的這個圖:

壁紙對應的是Launcher2裡面的WallpaperChooser.activity。動態壁紙對應的是packages/wallpapers/LivePicker的LiveWallpaperListActivity,他們的共同點 就是在AndroidManifest.xml都有

 <intent-filter>                <action android:name="android.intent.action.SET_WALLPAPER" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>

如下定義,或許你有了些許明白,看下http://groups.google.com/group/android-developers/browse_thread/thread/9d376a94066057a4這裡面的解釋,我英語不是太好,按照我自己的理解就是,你如果像下面這樣

Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER);        Intent chooser = Intent.createChooser(pickWallpaper,

建立一個intent chooser,系統會尋找所有activity,然後把有

 <intent-filter>                <action android:name="android.intent.action.SET_WALLPAPER" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>

定義的activity形成列表提供給使用者。為了驗證我的想法,個人寫了一個很簡單的小例子,MainActivity代碼如下:

public class MainActivity extends Activity {    /** Called when the activity is first created. */private Button button;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                button=(Button)findViewById(R.id.wallpaperButton);        button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubfinal Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER);       Intent chooser = Intent.createChooser(pickWallpaper,"tese the ACTION_SET_WALLPAPER");       startActivity(chooser);}});    }}

還有一個demo,代碼如下

public class Demo extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.demo);}}

demo.xml檔案裡面只有一個textview很簡單。
然後是AndroidManifest.xml檔案:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="cn.demo"      android:versionCode="1"      android:versionName="1.0">    <application android:icon="@drawable/icon" android:label="@string/app_name">        <activity android:name=".MainActivity"                  android:label="@string/app_name">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>
<activity android:name=".Demo">
      <intent-filter>
                <action android:name="android.intent.action.SET_WALLPAPER" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </activity>    </application></manifest>

注意:
 

</activity><activity android:name=".Demo"><intent-filter>                <action android:name="android.intent.action.SET_WALLPAPER" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </activity>

我在這裡面加了intent適配器 
<action android:name="android.intent.action.SET_WALLPAPER" />

運行下程式,點擊button按鈕,效果如下:

我這個網速太不給力了,弄的心煩意燥,大家看到我自己寫的demo在圖片中得到了顯示,這也是在上一篇 http://blog.csdn.net/aomandeshangxiao/article/details/6767423中給大家看的圖片,為什麼我的選項多了一個。說到這裡,想必大家都明白了這個原理了,中秋節還有幾分鐘就要到了,祝福大家中秋愉快。

上面所說的簡單的小例子:http://download.csdn.net/detail/aomandeshangxiao/3593740

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.