Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 安卓開發之 App Widget

安卓開發之 App Widget

編輯:關於Android編程

一、什麼是App Widget

Android平台上在桌面上所放置的一種小控件

與App Widget相關的類/對象:

AppWidgetProviderInfo對象:

定義App Widget的一些信息,為App Widget提供元數據,包括App Widget布局文件的指定,更新頻率等數據。
這個對象被定義在XML文件當中,其相對於一個Config配置“文件”.

AppWidgetProvider:

繼承自BroadcastReicever廣播接收器。
定義了App Widget的基本生命周期的回調函數.

二、創建一個App Widget的步驟

一、定義AppWidgetProviderInfo:

res/xml文件夾當中定義描述AppWidgetProviderInfo的xml文件。

例:…\res\xml\appwidget_info.xml





其中updatePeriodMillis為更新的毫秒數;initialLayout為初始化的布局;previewImage為該app widget的預覽圖,在桌面小部件選擇時顯示。

二、為App Widget指定布局:

定義App Widget展示時的布局文件appwidget_layout

例:…\res\layout\appwidget_layout.xml




    

三、實現AppWidgetProvider

onUpdate:在到達指定的更新時間之後或者當用戶向桌面添加App Widget時會調用該方法

onDeleted:在App Widget被刪除時,會調用該方法

onEnable:當一個App Widget的實例第一次被創建時,會調用該方法

onDisable:當最後一個App Widget實例被刪除後,會調用該方法

onReceive:監聽/接收廣播事件,可用於處理控件的點擊事件等

(桌面上可以有多個同樣的app widget)

例:

public class MyAppWidgetProvider 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);
    }

    @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);
    }

}

因AppWidgetProvider又繼承自BroadcastReceiver,所以需要在AndroidManifest中注冊:

    

        
            
        

        

    

其中action是引用android自己定義的action,meta-data為元數據,resource為提高App Widget 的配置信息的xml文件。

三、使用App Widget布局中的控件

>使用App Widget布局中的控件其中涉及到了PendingIntent,RemoteViews..

一、PendingIntent

Pending:待處理的。PendingIntent 可以看作為一種“留待日後處理”的意圖,是對Intent的一種包裝,創建之後並不馬上使用,一旦某種觸發事件的發生,意圖才馬上執行。

App Widget和應用程序並不是在同一進程當中。

創建PendingIntent對象的三個靜態方法:

getActivity(Context context, int requestCode, Intent intent, int flags) getBroadcast(Context context, int requestCode, Intent intent, int flags) getService(Context context, int requestCode, Intent intent, int flags)

根據PeningIntent具體發送/啟動(廣播/Activity/服務)來選擇對應的一個靜態方法來創建PendingIntent對象。

二、RemoteViews的作用

RemoteViews:遠程控件。App Widget裡的控件和主程序不在同一進程中,所以App Widget裡的控件相對於一種遠程控件。

RemoteViews對象表示了一系列的View對象。 RemoteViews所表示的對象運行在另外的進程中。 App Widget當中的View運行在Home Screen進程當中。

三、操作AppWidget的Button

由於AppWidget的Button不與主程序在同一進程中,所以無法按照之前慣用的方法給Button綁定監聽器。

為AppWidget的Button綁定監聽器:

新方法:remoteViews.setOnClickPendingIntent(R.id.widget_button, pendingIntent);
第一個參數為AppWidget的Button的id,第二參數為PendingIntent對象。
當Button被點擊時,會引起pendingIntent的執行。

例:重新實現AppWidgetProvider:點擊Button時啟動Activity

public class MyAppWidgetProvider extends AppWidgetProvider {

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        Log.i("z","onReceive");
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);

        // appWidgetMahager:管理app widget
        // appWidgetIds : appWidget的id數組(桌面可放置多個同樣的小部件)

        for (int i= 0;i< appWidgetIds.length;i++){

            //給每一個小部件的按鈕綁定監聽器
            Log.i("z",appWidgetIds[i]+" ");

            //創建一個Intent對象
            Intent intent = new Intent(context,MainActivity.class);
            //包裝成一個PendingIntent對象
            PendingIntent pendingIntent = PendingIntent.getActivity(context,0,intent,0);

            //得到RemoteViews對象
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout);
            //給app widget中的Button綁定監聽器
            remoteViews.setOnClickPendingIntent(R.id.widget_button,pendingIntent);

            //更新app widget
            appWidgetManager.updateAppWidget(appWidgetIds[i],remoteViews);

        }


    }

    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);
        Log.i("z","onDeleted");
    }

    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        Log.i("z","onEnabled");
    }

    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
        Log.i("z","onDisabled");
    }

}

四、接收來自AppWidget的廣播和更新控件的狀態

在AndroidManifest當中為AppWidgetProvider注冊新的intent-filter,配置所要接收的廣播行為。AppWidgetProvider本質上是一個廣播接收器

使用getBroadcast(…)方法創建一個發送廣播PendingIntent。

為AppWidget當中的控件注冊處理器,用來觸發發送廣播的行為。

在onReceive方法當中接收來自AppWidget發送的廣播消息,並執行自己的業務邏輯,使用RemoteViews對象更新App Widget當中的控件狀態。

AppWidgetProvider的運行機制:通過onReceive來接收廣播,接收到特定的系統內置廣播時來調用onUpdate(..)等生命周期的回調方法,由onReceive來調用生命周期函數。

例:重新在AndroidMainfest注冊AppWidgerProvider:

    
        
            
        

        
            
        

        

    

“android.appwidget.action.APPWIDGET_UPDATE”:系統自帶廣播,用來接收後回調聲明周期函數。
“my.appwidget.Text_UPDATE”:自定義廣播,用來接收後進行對TextView的操作。

重新實現AppWidgetProvider:

public class MyAppWidgetProvider extends AppWidgetProvider {


    private static final String TEXT_UPDATE = "my.appwidget.Text_UPDATE";

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

        if(intent!=null&& TextUtils.equals(TEXT_UPDATE,intent.getAction())){

            Log.i("z","onReceiveTextUpdate");

            //獲取app widget的所有控件
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout);

            //設置TextView的文本
            remoteViews.setTextViewText(R.id.widget_text,"Changed Text");

            //獲取app widget的管理器
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

            //獲取app widget的對象
            ComponentName componentName = new ComponentName(context,MyAppWidgetProvider.class);

            //管理器更新app widget
            appWidgetManager.updateAppWidget(componentName,remoteViews);

        }

    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);

        // appWidgetMahager:管理app widget
        // appWidgetIds : appWidget的id數組(桌面小部件可重復放置多個小部件)

        for (int i= 0;i< appWidgetIds.length;i++){

            Log.i("z",appWidgetIds[i]+" ");
            //創建一個發送廣播的Intent對象,並設置action
            Intent intent = new Intent();
            intent.setAction(TEXT_UPDATE);
            //包裝成一個PendingIntent對象,執行時會發送一個廣播。
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intent,0);

            //得到RemoteViews對象
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout);
            //給app widget中的Button綁定監聽器
            remoteViews.setOnClickPendingIntent(R.id.widget_button,pendingIntent);

            //更新app widget
            appWidgetManager.updateAppWidget(appWidgetIds[i],remoteViews);
        }


    }

    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);
        Log.i("z","onDeleted");
    }

    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        Log.i("z","onEnabled");
    }

    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
        Log.i("z","onDisabled");
    }

}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved