Launcher: 设置壁纸_IntentChooser

博客  android opensource: Launcher 研究_设置壁纸_01  大致分析了一下 Launcher 壁纸的相关代码调用关系。

但是对于自己来说,还是觉得有点欠缺,今天补上,继续 Launcher 壁纸的研究。


真的希望 csdn 能够让自己的博客别人来补充编辑,这样可以对技术研究比较深、细一点,利于交流和学习。呵呵,愿望希望有一天能够被实现。


再说主题之前,想跟大家交流一个话题:现在学 android 是否还有前途,究竟学什么?


我刚开始接触 android 的时候,根本没有想过学这个东西是否有前途,于是自己就傻乎乎的搭建环境、下载开发工具、了解 android 基本知识。说实话,自己没接触过 java,只是知道 java 是一种高级语言,然后有个朋友给我说,你不学 C++ 不可能学会 java,当时我就蒙了,怎么这麽折腾?我自己偏是不信,直接学习 java,等 java 学的差不多的时候,我回过头再去学学 C++(之前学过、用过 C),当然只是懂个皮毛,呵呵!


学习的过程除了看书上网,其余的时间就是写代码,上次面试的时候,有个哥们问我到现在为止写过多上行代码?可怜的娃,我不知道怎么回答,就反过来问他,那小子嘿嘿一笑!没有多少人去计算到底写过多少行代码,特别是在这个忙碌的时代,别人(99%的面试官)最关心的是你做过多少项目,在项目中做什么?android 是一个平台,用到很多方面的知识,当然这取决于你对哪个方面感兴趣喽?比如说,底层驱动开发,那麽你会 C 和 linux 就可以了,没必要学习 java,照样拿高工资。应用层,用到最多的就是网络编程以及 xml 解析、数据存储方面的知识,所以要对平台 SDK API 很熟,java 基础要好!很多公司对 UI 要求很高,如果你喜欢界面设计(我一个朋友现在做 android UI, 很强哟!)并且做很High,工资也会让你满意。总之,学习 android 不仅仅是其本身,它牵连着技术的方方面面。所以,学习 android 不会影响你做技术,如果你是一个技术爱好者,学习 android 照样有前途。


学习 android,除了学习该平台自身的知识和特点之外,当然要学习 java , 并且要学好,那麽你才会在 App 领域有所突破。如果你想学习游戏开发,数据结构和算法还是要学学的。


扯淡的话,到此为止,欢迎拍砖,交流、学习。


================================================================================

下面开始正题的切入,主要说两个问题。


1. Intent.createChooser

在 Launcher.java 中,我们看到如下的代码(属于 startWallpaper() 方法)

 private void startWallpaper() {
        closeAllApps(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);
    }

当执行这段代码的时候,系统会调用相关的 Activity 响应事件。为了更好的理解它,不妨来个 Demo。


a. 新建一个项目 IntentCreateChooserDemo


很简单,就是一个 Activity,点击 Button 触发事件,源码如下:

package mark.zhang.main;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class IntentCreatChooserDemoActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViewById(R.id.btn_click).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                final Intent mIntent = new Intent("mark.zhang.intent");
                Intent chooser = Intent.createChooser(mIntent, "列表");
                startActivity(chooser);
            }
        });

    }
}

b. 新建一个项目 ResponseActivity,该项目只包含两个 Activity


项目结构图如下:



这两个 Activity 代码部分很简单,都是一样的代码和布局:

package mark.zhang.response;

import android.app.Activity;
import android.os.Bundle;

public class ResponseActivity extends Activity {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

主要看一下 manifest.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="mark.zhang.response"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="ResActivityI" >
        <activity
          android:label="ResActivityI"
            android:name=".ResponseActivity" >
            <intent-filter >
                <action android:name="mark.zhang.intent" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        
             <activity
                  android:label="ResActivityII"
            android:name=".ResActivityII" >
            <intent-filter >
                <action android:name="mark.zhang.intent" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>

</manifest>

很简单,就是一个 Activity,点击 Button 触发事件,源码如下:这两个 Activity 的 action 都是 mark.zhang.intent,然后 category 都是 android.intent.category.DEFAULT,注意如果你隐式启动 Activity 必须包含 category 选项,否则只靠 action 无法找到它。


c. 运行


首先运行 ResponseActivity 这个项目,然后再运行 IntentCreateChooserDemo,效果如下:




至此你就可以明白,即使这两个 Activity 与 要启动他的 Activity 不在同一个 App 中也是有效的,当然了,如果这两个 Activity 与启动它的 Activity 在同一个 App 也是可以的,这里大家可以自行验证。


2. 更换 Launcher 背景


Laucher 第一次加载的 xml 文件是 launcher.xml,位于 res/layout-land 下面。

想试着在 Launcher 的 launcher.xm l文件中改变其背景,也就是加上 background 属性,但是效果很让人差异。改变之后,再次想为 Launcher 添加其它壁纸,或者动态壁纸均不会有效果。


所以大家在开发的过程中要注意这一点。




©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页