アンドロイド学習ノートのwidgetデスクトップコントロール

16176 ワード

アンドロイド学習ノートのwidgetデスクトップコントロール
使用手順
必要なReceiverを作成し、リストファイルに配置します.
 <!--       -->
        <receiver android:name="com.yu.receiver.SaferAppWidgetProvider" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data  android:name="android.appwidget.provider" android:resource="@xml/safer_appwidget_info" />
        </receiver>
package com.yu.receiver;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;

import com.yu.service.KillProcesWidgetService;

public class SaferAppWidgetProvider extends AppWidgetProvider {

    /** *             */
    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
    }

    /** *                   */
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        //           
        context.startService(new Intent(context,KillProcesWidgetService.class));
    }

    /** *              */
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);

    }

    /** *               */
    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
    }

    /** *                 */
    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
        //           
        context.startService(new Intent(context,KillProcesWidgetService.class));
    }
    /** * Called in response to the AppWidgetManager.ACTION_APPWIDGET_RESTORED broadcast * when instances of this AppWidget provider have been restored from backup */
    @Override
    public void onRestored(Context context, int[] oldWidgetIds,
            int[] newWidgetIds) {
        super.onRestored(context, oldWidgetIds, newWidgetIds);
    }

}
srcのxmlファイルでsafer_を作成します.appwidget_info.xmlは、widgetを配置するために使用されます.
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/widget_process_safer" android:minHeight="75.0dip" <!-minHeightwidget    --> android:minWidth="294.0dip" android:updatePeriodMillis="0" /><!-   0,        --> 
layoutディレクトリでwidgetのレイアウトファイルwidget_を作成します.process.safer
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/widget_bg_portrait" android:orientation="horizontal" >

    <LinearLayout  android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/widget_bg_portrait_child" android:gravity="center" android:orientation="vertical" >
        <TextView  android:id="@+id/tv_count_widget" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="     " />
        <TextView  android:id="@+id/tv_freeMem_widget" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:text="    " />
    </LinearLayout>

    <LinearLayout  android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:padding="5dp" android:orientation="vertical" >
        <TextView  android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="    " />
        <Button  android:id="@+id/bt_clean" style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="@drawable/bt_selector" android:layout_marginTop="6dp" android:paddingLeft="3dp" android:paddingRight="3dp" android:textColor="#000" android:text="    " />
    </LinearLayout>
</LinearLayout>
設定が完了しました.widgetの使用を開始します.widgetを更新するためのサービスを新設します.
1、アプリWidgetMangerのgetInstance方法でWidgetマネージャ2、実装Timerオブジェクトを取得し、TimerTaskでスレッドを作成し、timerのschedule方法でタイミングタスク3をオープンし、TimeTaskのrun方法でWidgetに必要なRemoteViewsを作成し、対応するコントロールとCompone 4を作成します.RemoteViewsとComponentNameをwidgetに設定し、widgetを更新します.
package com.yu.service;

import java.util.Timer;
import java.util.TimerTask;

import com.yu.receiver.SaferAppWidgetProvider;
import com.yu.safer.R;
import com.yu.utils.SystemInfoUtils;

import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Intent;
import android.os.IBinder;
import android.text.format.Formatter;
import android.widget.RemoteViews;

/** *         * @author Administrator * */
public class KillProcesWidgetService extends Service {
    AppWidgetManager awm;
    ComponentName appWidgetProvider;
    Timer timer;
    TimerTask task;
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        //   widget   
        awm = AppWidgetManager.getInstance(this);

        //          5   widget
        timer = new Timer();
        task = new TimerTask() {

            @Override
            public void run() {
                //         view(RemoteViews)
                RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget_process_safer);

                //           
                int count = SystemInfoUtils.getRunningAppCount(KillProcesWidgetService.this);
                //          
                String freeMem = Formatter.formatFileSize(KillProcesWidgetService.this,
                        SystemInfoUtils.getFreeMemoryInfo(KillProcesWidgetService.this));

                //   views  
                views.setTextViewText(R.id.tv_count_widget, "     :"+count+" ");
                views.setTextViewText(R.id.tv_freeMem_widget, "    :"+freeMem);

                Intent i = new Intent();
                //        
                i.setAction("com.yu.safer.widget");
                //   PendingIntent              
                PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0);
                //       
                views.setOnClickPendingIntent(R.id.bt_clean, pendingIntent );

                appWidgetProvider = new ComponentName(getApplicationContext(), SaferAppWidgetProvider.class);
                awm.updateAppWidget(appWidgetProvider, views);

            }
        };
        timer.schedule(task, 1000, 5000);
        return super.onStartCommand(intent, flags, startId);
    }

}