Android 窗口小部件例子

来源:互联网 发布:5s4g网络怎么设置a1453 编辑:程序博客网 时间:2024/05/17 04:19

       要制作一个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;

         本来想将源码直接上传的,这里好像上传不了,有需要的可以留下邮箱!谢谢!

 

原创粉丝点击