博客 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 添加其它壁纸,或者动态壁纸均不会有效果。
所以大家在开发的过程中要注意这一点。