1. 程式人生 > >在自己應用中判斷剛剛去往動態桌布預覽頁面的桌布是否設定成功

在自己應用中判斷剛剛去往動態桌布預覽頁面的桌布是否設定成功

本來從動態桌布預覽頁面設定一個動態桌布回到桌面便可以看到桌面動態桌布,可以觀察得到自己的動態桌布是否設定成功了(必須知道設定是否成功的結構,因為還有一些操作需要完成)!

但是現在是要在自己的應用中進入到動態桌布預覽頁面(去往某個動態桌布的預覽頁面,那裡可以設定桌布)點選“設定桌布”之後回到自己的應用是看不到桌面的,而且又不想直接退出自己的應用!此時該怎麼得到想要的結果呢?

在LiveWallpaperPreview的setLiveWallpaper方法中有一個setResult(RESULT_OK);也就是說可以回撥得到結果,所以很興奮的嘗試了一把,結果發現設定動態桌布成功後得到的resultCode=0.這是為什麼呢?經過大神指點發現,正常的路徑從動態桌布列表進入的某動態桌布預覽頁面是通過類的呼叫,也就是同一個程序,所以回撥是有效的。但是我這個從應用進入到預覽頁面是通過廣播進入的,是跨程序的,所以是無法得到該返回碼的!而預覽頁面也沒提供該結果的介面,所以這條路是行不通的!

解決:從預覽頁面回到自己應用有兩種可能,一種是在預覽頁面直接按返回鍵,這種情況是沒有設定自己特有的動態桌布的,而另一種是點選了“設定桌布”再回到自己應用的,這個時候系統已經將動態桌布設定為自己特有的動態桌布了,所以此時自己的動態桌布已經在運行了。所以我只要從預覽頁面回到自己應用判斷自己的動態桌布是否已經運行了就可以知道設定桌布是否成功了!(判斷一個動態桌布是否已經在執行

以回撥方式去往動態桌布預覽頁面

/**
     * 去往某個動態桌布的預覽頁面,那裡可以設定桌布
     * 
     * @param context
     * @param packageName
     *            動態桌布的包名
     * @param classFullName
     *            動態桌布service類的類全名
     */
    @SuppressLint("InlinedApi")
    public static void startLiveWallpaperPrevivew(Activity activity, String packageName, String classFullName) {
        ComponentName componentName = new ComponentName(packageName, classFullName);
        Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
        intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, componentName);
        activity.startActivityForResult(intent, Configs.REQUEST_SET_LIVE_WALLPAPER);
    }

 回到自己應用時判斷自己的動態桌布是否正在執行

/**
     * 判斷一個動態桌布是否已經在執行
     * 
     * @param context
     *            :上下文
     * @param tagetPackageName
     *            :要判斷的動態桌布的包名
     * @return
     */
    public static boolean isLiveWallpaperRunning(Context context, String tagetPackageName) {
        WallpaperManager wallpaperManager = WallpaperManager.getInstance(context);// 得到桌布管理器
        WallpaperInfo wallpaperInfo = wallpaperManager.getWallpaperInfo();// 如果系統使用的桌布是動態桌布話則返回該動態桌布的資訊,否則會返回null
        if (wallpaperInfo != null) { // 如果是動態桌布,則得到該動態桌布的包名,並與想知道的動態桌布包名做比較
            String currentLiveWallpaperPackageName = wallpaperInfo.getPackageName();
            if (currentLiveWallpaperPackageName.equals(tagetPackageName)) {
                return true;
            }
        }
        return false;
    }

 返回到自己應用回撥判斷

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == Configs.REQUEST_SET_LIVE_WALLPAPER) {
            if (isLiveWallpaperRunning(context,tagetPackageName)) {
                //do something
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }