文档章节

android 壁纸设置分析

Mr_Qi
 Mr_Qi
发布于 2013/06/09 15:26
字数 816
阅读 2958
收藏 5

最近组织上派遣了我一个任务,最终目的只有一个,就是看看launcher你的wallpaper设置的流程。

废话不多说,直接看源码。

tips:在com.android.launcher2.Launcher类内有一个方法叫做startWallpaper(),很明显此方法就是设置壁纸的关键所在。

要说我是怎么知道的,大概老外起名字也不是随便起的,要是找类似的功能,比如创建快捷方式,在Launcher类里

按快捷键CTRL+O 键入对应的英文比如(*shortcut*),列出来的方法看名字也能猜出来对吧。同上,wallpaper就是这么找到的。

private void startWallpaper() {
        showWorkspace(true);
        final Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER);
        Intent chooser = Intent.createChooser(pickWallpaper,
                getText(R.string.chooser_wallpaper));
        // NOTE: Adds a configure option to the chooser if the wallpaper supports it
        //       Removed in Eclair MR1
//        WallpaperManager wm = (WallpaperManager)
//                getSystemService(Context.WALLPAPER_SERVICE);
//        WallpaperInfo wi = wm.getWallpaperInfo();
//        if (wi != null && wi.getSettingsActivity() != null) {
//            LabeledIntent li = new LabeledIntent(getPackageName(),
//                    R.string.configure_wallpaper, 0);
//            li.setClassName(wi.getPackageName(), wi.getSettingsActivity());
//            chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { li });
//        }
        startActivityForResult(chooser, REQUEST_PICK_WALLPAPER);
    }

 

以上代码中Intent的chooser静态方法没有使用过,没有关系,看对应的api就是了。

public static Intent createChooser (Intent target, CharSequence title)

Added in  API level 1

Convenience function for creating a ACTION_CHOOSER Intent.

Builds a new ACTION_CHOOSER Intent that wraps the given target intent, also optionally supplying a title. If the target intent has specifiedFLAG_GRANT_READ_URI_PERMISSION or FLAG_GRANT_WRITE_URI_PERMISSION, then these flags will also be set in the returned chooser intent, with its ClipData set appropriately: either a direct reflection of getClipData() if that is non-null, or a new ClipData build from getData().

Parameters

target The Intent that the user will be selecting an activity to perform.
title Optional title that will be displayed in the chooser.

Returns

很明显这个方法是将该IntentFIlter中符合该Intent的activity全都列出来,然后第二个参数就是展示的chooser的标题。

当点击对应的item就会打开对应的activity,而launcher源码中存在一个对应的activity,清单文件中有提及到。

 

 <activity
            android:name="com.android.launcher2.WallpaperChooser"
            style="@style/Theme.WallpaperPicker"
            android:label="@string/pick_wallpaper"
            android:icon="@drawable/ic_launcher_wallpaper"
            android:finishOnCloseSystemDialogs="true"
            android:process=":wallpaper_chooser">
            <intent-filter>
                <action android:name="android.intent.action.SET_WALLPAPER" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <meta-data android:name="android.wallpaper.preview"
                android:resource="@xml/wallpaper_picker_preview" />
        </activity>

因此顺藤摸瓜,看看设置壁纸是如何实现的。找到WallpaperChooser类,查看源码

public class WallpaperChooser extends Activity {
    private static final String TAG = "Launcher.WallpaperChooser";


    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.wallpaper_chooser_base);


        Fragment fragmentView =
                getFragmentManager().findFragmentById(R.id.wallpaper_chooser_fragment);
        Log.i(TAG, "wallpaper"+(fragmentView==null));
        // TODO: The following code is currently not exercised. Leaving it here in case it
        // needs to be revived again.
        if (fragmentView == null) {
            /* When the screen is XLarge, the fragment is not included in the layout, so show it
             * as a dialog
             */
            DialogFragment fragment = WallpaperChooserDialogFragment.newInstance();
            fragment.show(getFragmentManager(), "dialog");
        }
    }
}

事实上在对应的layout上有如下

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment class="com.android.launcher2.WallpaperChooserDialogFragment"
        android:id="@+id/wallpaper_chooser_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>


实际是使用了WallpaperChooserDialogFragment,注释说了如果是Xlarge屏幕,没有显示该fragment,则获得WallpaperChooserDialogFragment对象

大概看到应该是在倒数第二句话中使用了一个fragment 选择壁纸。继续找到WallpaperChooserDialogFragment.类,果然

private void selectWallpaper(int position) {
        try {
            WallpaperManager wpm = (WallpaperManager) getActivity().getSystemService(
                    Context.WALLPAPER_SERVICE);
            wpm.setResource(mImages.get(position));
            Activity activity = getActivity();
            activity.setResult(Activity.RESULT_OK);
            activity.finish();
        } catch (IOException e) {
            Log.e(TAG, "Failed to set wallpaper: " + e);
        }
    }


    // Click handler for the Dialog's GridView
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        selectWallpaper(position);
    }

这一段就是真正的实现壁纸设置的方法。使用WallpaperManager.setResource(arg0)设置。   

  activity.setResult(Activity.RESULT_OK);将会在Launcher你的onActivityResult方法接收到,

此时也就是设置了对应的壁纸。

 

android 壁纸设置分析http://blog.csdn.net/q13073451412/article/details/9063283

© 著作权归作者所有

Mr_Qi

Mr_Qi

粉丝 288
博文 12
码字总数 13288
作品 0
南京
程序员
私信 提问
加载中

评论(3)

yayax
yayax
怎么设置锁屏?
yayax
yayax
59
Mr_Qi
Mr_Qi 博主
话说csdn和osc的代码着色都是要手动选择的是吗,蛋疼~~~~
Android窗口管理服务WindowManagerService对壁纸窗口(Wallpaper Window)的管理分析

在Android系统中,壁纸窗口和输入法窗口一样,都是一种特殊类型的窗口,而且它们都是喜欢和一个普通的Activity窗口缠绵在一起。大家可以充分地想象这样的一个3W场景:输入法窗口在上面,壁纸...

Luoshengyang
2018/06/26
0
0
Android窗口管理服务WindowManagerService切换Activity窗口(App Transition)的过程分析

在Android系统中,同一时刻只有一个Activity组件是处于激活状态的,因此,当ActivityManagerService服务激活了一个新的Activity组件时,它就需要通知WindowManagerService服务将该Activity组...

Luoshengyang
2018/06/26
0
0
Android Wallpaper之设置壁纸流程

What? 什么是壁纸? android wallpaper包括锁屏壁纸和桌面壁纸,壁纸又区分静态和动态两种。我们每天使用手机第一眼看到的就是壁纸,好看的壁纸对于手机的颜值也有大大的提升(滑稽),就让我...

天王盖地虎626
09/09
37
0
android锁屏壁纸如何实现

想请问下android下的锁屏壁纸是如何实现的,也就如何调用系统里面的“设置锁屏壁纸”这个应用,或者android那个api里面有设置锁屏壁纸的方法或接口之类的 WallpaperManager.getInstance(mCo...

misly
2012/04/16
8.1K
7
[Android L]Launcher3:wallpaper_chooser 切换壁纸闪退

软件版本:Android L 长按屏幕-->选择左侧"wallpapers"-->在壁纸选择界面,尝试连续多次点击不同的壁纸预览(15-20次左右会闪退) 分析原因:在点击预览不同壁纸时,com.android.launcher3:w...

泥巴刀儿
2015/01/06
355
0

没有更多内容

加载失败,请刷新页面

加载更多

一起来学Java8(四)——复合Lambda

在一起来学Java8(二)——Lambda表达式中我们学习了Lambda表达式的基本用法,现在来了解下复合Lambda。 Lambda表达式的的书写离不开函数式接口,复合Lambda的意思是在使用Lambda表达式实现函...

猿敲月下码
27分钟前
9
0
debian10使用putty配置交换机console口

前言:Linux的推广普及,需要配合解决实际应用方能有成效! 最近强迫自己用linux进行实际工作,过程很痛苦,还好通过网络一一解决,感谢各位无私网友博客的帮助! 系统:debian10 桌面:xfc...

W_Lu
59分钟前
10
0
aelf Enterprise 0.8.0 beta有奖公测,“Bug奖金计划”重磅开启

2019年9月30日,aelf Enterprise 0.8.0 beta版正式发布。aelf Enterprise 0.8.0 beta是一个完备的区块链系统, 包含完备的区块链系统、开发套件、开发文档、以及配套的基础应用和基础服务。 ...

AELF开发者社区
今天
10
0
oracle 初始化数据库脚本

create user lpf identified by 123456; create tablespace lpf_ts_cms datafile '/opt/app/oracle/product/11.2.0/lpf.dbf' size 200M; alter user lpf default tablespace lpf_ts_cms; sel......

internetafei
今天
8
0
深入了解Redis底层数据结构

说明 说到Redis的数据结构,我们大概会很快想到Redis的5种常见数据结构:字符串(String)、列表(List)、散列(Hash)、集合(Set)、有序集合(Sorted Set),以及他们的特点和运用场景。不过它们是...

TurboSanil
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部