要制作一个android的窗口小部件,功能:里面增加8个快捷按钮,包括:photo,video,music,browse,allapps display,setting,文件管理器,camera,由于picasa这个APK我没有安装,就把他做成了Camera了,实现的效果图:
(1):需要创建一个类widgetProvider继承于AppWidgetProvider,然后在重载AppWidgetProvider类的几个方法:onDelete,onEnable,onUpdate等方法,在onUpdate中会启动后来widget的服务appWidgeManger来管理widget;
(2):在AndroidMenifest.xml中添加一个receiver标签,让其指向widgetProvider子类 ,本例所使用到的AndroidManifest.xml的内容如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.terry" android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name=".widgetProvider">
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/appwidget_provider"></meta-data>
<intent-filter>
<action android:name="com.terry.action.widget.click"></action>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
</receiver>
</application>
</manifest>
(3):在上面的AndroidMenifest.xml中android:resource="@xml/appwidget_provider"中定义了widget的相关信息,如widget的长度,宽度,更新时间等,本例所使用到的appwidget_provider.xml文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="480dip"
android:minHeight="280dip"
android:updatePeriodMillis="86400000"
android:previewImage="@drawable/preview"
android:initialLayout="@layout/main">
</appwidget-provider>
其中android:updatePeriodMillis是自动更新的时间间隔,android:initialLayout是Widget的界面描述文件。Android:configure是可选的,如果你的Widget需要在启动时先启动一个Activity,则需要设定该项为你的Activity。本例中,不需要实现这个属性。
(4):在layout下面编写widget的界面信息:main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical"
android:layout_weight="1"
>
<LinearLayout
android:id="@+id/ImageButton01"
android:layout_width="10dip"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/appwidget_button_right"
android:layout_weight="1"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="10dip"
android:src="@drawable/ic_photo"
android:layout_weight="3"
android:scaleType="center"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="10dip"
android:layout_weight="1"
android:text="@string/photo"
android:gravity="center"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/ImageButton02"
android:layout_width="10dip"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/appwidget_button_right"
android:layout_weight="1"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="10dip"
android:src="@drawable/ic_music"
android:layout_weight="3"
android:scaleType="center"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="10dip"
android:layout_weight="1"
android:text="@string/music"
android:gravity="center"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/ImageButton03"
android:layout_width="10dip"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/appwidget_button_right"
android:layout_weight="1"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="10dip"
android:src="@drawable/ic_video"
android:layout_weight="3"
android:scaleType="center"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="10dip"
android:layout_weight="1"
android:text="@string/video"
android:gravity="center"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/ImageButton04"
android:layout_width="10dip"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/appwidget_button_right"
android:layout_weight="1"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="10dip"
android:src="@drawable/ic_file"
android:layout_weight="3"
android:scaleType="center"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="10dip"
android:layout_weight="1"
android:text="@string/file"
android:gravity="center"
/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical"
android:layout_weight="1"
>
<LinearLayout
android:id="@+id/ImageButton05"
android:layout_width="10dip"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/appwidget_button_right"
android:layout_weight="1"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="10dip"
android:src="@drawable/ic_setting"
android:layout_weight="3"
android:scaleType="center"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="10dip"
android:layout_weight="1"
android:text="@string/setting"
android:gravity="center"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/ImageButton06"
android:layout_width="10dip"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/appwidget_button_right"
android:layout_weight="1"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="10dip"
android:src="@drawable/ic_android"
android:layout_weight="3"
android:scaleType="center"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="10dip"
android:layout_weight="1"
android:text="@string/android"
android:gravity="center"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/ImageButton07"
android:layout_width="10dip"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/appwidget_button_right"
android:layout_weight="1"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="10dip"
android:src="@drawable/ic_picasa"
android:layout_weight="3"
android:scaleType="center"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="10dip"
android:layout_weight="1"
android:text="@string/picasa"
android:gravity="center"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/ImageButton08"
android:layout_width="10dip"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/appwidget_button_right"
android:layout_weight="1"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="10dip"
android:src="@drawable/ic_browse"
android:layout_weight="3"
android:scaleType="center"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="10dip"
android:layout_weight="1"
android:text="@string/internet"
android:gravity="center"
/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
(5):接下来就是编写软件实现widget的功能,代码如下:
package com.terry;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
import android.widget.Toast;
public class widgetProvider extends AppWidgetProvider {
private static RemoteViews rv;
private static final String CLICK_NAME_ACTION = "com.terry.action.widget.click";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
super.onReceive(context, intent);
if (rv == null) {
rv = new RemoteViews(context.getPackageName(), R.layout.main);
}
AppWidgetManager appWidgetManger = AppWidgetManager
.getInstance(context);
int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName(
context, widgetProvider.class));
appWidgetManger.updateAppWidget(appIds, rv);
}
public static void updateAppWidget(Context context,
AppWidgetManager appWidgeManger, int appWidgetId) {
rv = new RemoteViews(context.getPackageName(), R.layout.main);
Intent intent=new Intent(CLICK_NAME_ACTION);
//intent.setComponent(cn);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0 , intent, 0 );
rv.setOnClickPendingIntent(R.id.ImageButton06, pendingIntent);
ComponentName cn = new ComponentName("com.android.gallery3d", "com.android.gallery3d.app.Gallery");
intent.setComponent(cn);
pendingIntent = PendingIntent.getActivity(context,0 , intent, 0 );
rv.setOnClickPendingIntent(R.id.ImageButton01, pendingIntent);
cn = new ComponentName("com.android.music", "com.android.music.MusicBrowserActivity");
intent.setComponent(cn);
pendingIntent = PendingIntent.getActivity(context,0 , intent, 0 );
rv.setOnClickPendingIntent(R.id.ImageButton02, pendingIntent);
cn = new ComponentName("android.rk.RockVideoPlayer", "android.rk.RockVideoPlayer.RockVideoPlayer");
intent.setComponent(cn);
pendingIntent = PendingIntent.getActivity(context,0 , intent, 0 );
rv.setOnClickPendingIntent(R.id.ImageButton03, pendingIntent);
cn = new ComponentName("com.android.settings", "com.android.settings.Settings");
intent.setComponent(cn);
pendingIntent = PendingIntent.getActivity(context,0 , intent, 0 );
rv.setOnClickPendingIntent(R.id.ImageButton05, pendingIntent);
cn = new ComponentName("com.android.browser", "com.android.browser.BrowserActivity");
intent.setComponent(cn);
pendingIntent = PendingIntent.getActivity(context,0 , intent, 0 );
rv.setOnClickPendingIntent(R.id.ImageButton08, pendingIntent);
cn = new ComponentName("com.android.gallery3d", "com.android.camera.Camera");
intent.setComponent(cn);
pendingIntent = PendingIntent.getActivity(context,0 , intent, 0 );
rv.setOnClickPendingIntent(R.id.ImageButton07, pendingIntent);
cn = new ComponentName("com.android.rk", "com.android.rk.RockExplorer");
intent.setComponent(cn);
pendingIntent = PendingIntent.getActivity(context,0 , intent, 0 );
rv.setOnClickPendingIntent(R.id.ImageButton04, pendingIntent);
appWidgeManger.updateAppWidget(appWidgetId, rv);
}
}
(6):要实现Android这个键的功能(进入lancher中的ALLAPPS页面),需要更改lancher的代码,我得做法是在widget中发一个广播CLICK_NAME_ACTION = "com.terry.action.widget.click",然后在lancher里面去接收这个广播,收到广播之后再执行showAllApps(true)这个函数,就会进入到allapps页面,下面将lancher中更改的PATCH列出:
diff --git a/packages/apps/Launcher2/src/com/android/launcher2/Launcher.java b/packages/apps/Launcher2/src/com/android/launcher2/Launcher.java
old mode 100644
new mode 100755
index c2b5c1e..3002807
--- a/packages/apps/Launcher2/src/com/android/launcher2/Launcher.java
+++ b/packages/apps/Launcher2/src/com/android/launcher2/Launcher.java
@@ -117,6 +117,7 @@ import java.util.Set;
public final class Launcher extends Activity
implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks,
AllAppsView.Watcher, View.OnTouchListener {
+ private static final String CLICK_NAME_ACTION = "com.terry.action.widget.click";
static final String TAG = "Launcher";
static final boolean LOGD = false;
@@ -1172,7 +1173,6 @@ public final class Launcher extends Activity
mUserPresent = false;
mDragLayer.clearAllResizeFrames();
updateRunning();
// Reset AllApps to its initial state only if we are not in the middle of
// processing a multi-step drop
if (mAppsCustomizeTabHost != null && mPendingAddInfo.container == ItemInfo.NO_ID) {
@@ -1183,6 +1183,9 @@ public final class Launcher extends Activity
mUserPresent = true;
updateRunning();
}
+ else if (action.equals(CLICK_NAME_ACTION)) {
+ showAllApps(true);
+ }
}
};
@@ -1194,6 +1197,7 @@ public final class Launcher extends Activity
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
+ filter.addAction(CLICK_NAME_ACTION);
registerReceiver(mReceiver, filter);
mAttached = true;
本来想将源码直接上传的,这里好像上传不了,有需要的可以留下邮箱!谢谢!