talin2010 发表于 2013-1-29 22:35:33

API DEMO APPWIGHT 学习

1: APP WIGHT的 AppWidget Provider 配置文件 appwight_provider.xml
新建xml文件->类型:AppWidget Provider->文件会新建在res/xml下
它包含了Widget在桌面的大小(74*单元格-2),
单位dip,Widget自动更新的周期(android:updatePeriodMillis)此方法1.5以后已经失效,默认30分钟更新一次,如要自定义可以通过service在定时器中实现,添加Widget时假如要先进入一个界面进行配置,
这个就指定了配置Activity是谁(android:configure="com.example.android.apis.appwidget.ExampleAppWidgetConfigure");
该文件是在Receiver的resource属性里被指定的。
initiaLayout指定界面布局文件
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"    android:minWidth="60dp"    android:minHeight="30dp"    android:updatePeriodMillis="86400000"    android:initialLayout="@layout/appwidget_provider"    android:configure="com.example.android.apis.appwidget.ExampleAppWidgetConfigure"    ></appwidget-provider>
      <receiver android:name=".appwidget.ExampleAppWidgetProvider">            <meta-data android:name="android.appwidget.provider"                  android:resource="@xml/appwidget_provider" />            <intent-filter>                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />            </intent-filter>      </receiver>
2: APP WIGHT的界面布局 appwidgt_provider res/layout/
<TextView xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/appwidget_text"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:textColor="#ff000000"/>
3: app widht 核心处理代码
/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.android.apis.appwidget;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.os.SystemClock;import android.util.Log;import android.widget.RemoteViews;import java.util.ArrayList;// Need the following import to get access to the app resources, since this// class is in a sub-package.import com.example.android.apis.R;/** * A widget provider.We have a string that we pull from a preference in order to show * the configuration settings and the current time when the widget was updated.We also * register a BroadcastReceiver for time-changed and timezone-changed broadcasts, and * update then too. * * <p>See also the following files: * <ul> *   <li>ExampleAppWidgetConfigure.java</li> *   <li>ExampleBroadcastReceiver.java</li> *   <li>res/layout/appwidget_configure.xml</li> *   <li>res/layout/appwidget_provider.xml</li> *   <li>res/xml/appwidget_provider.xml</li> * </ul> */public class ExampleAppWidgetProvider extends AppWidgetProvider {    // log tag    private static final String TAG = "ExampleAppWidgetProvider";    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {      Log.d(TAG, "onUpdate");      // For each widget that needs an update, get the text that we should display:      //   - Create a RemoteViews object for it      //   - Set the text in the RemoteViews object      //   - Tell the AppWidgetManager to show that views object for the widget.      final int N = appWidgetIds.length;      for (int i=0; i<N; i++) {            int appWidgetId = appWidgetIds;            String titlePrefix = ExampleAppWidgetConfigure.loadTitlePref(context, appWidgetId);            updateAppWidget(context, appWidgetManager, appWidgetId, titlePrefix);      }    }      public void onDeleted(Context context, int[] appWidgetIds) {      Log.d(TAG, "onDeleted");      // When the user deletes the widget, delete the preference associated with it.      final int N = appWidgetIds.length;      for (int i=0; i<N; i++) {            ExampleAppWidgetConfigure.deleteTitlePref(context, appWidgetIds);      }    }    public void onEnabled(Context context) {      Log.d(TAG, "onEnabled");      // When the first widget is created, register for the TIMEZONE_CHANGED and TIME_CHANGED      // broadcasts.We don't want to be listening for these if nobody has our widget active.      // This setting is sticky across reboots, but that doesn't matter, because this will      // be called after boot if there is a widget instance for this provider.      PackageManager pm = context.getPackageManager();      pm.setComponentEnabledSetting(                new ComponentName("com.example.android.apis", ".appwidget.ExampleBroadcastReceiver"),                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,                PackageManager.DONT_KILL_APP);    }    public void onDisabled(Context context) {      // When the first widget is created, stop listening for the TIMEZONE_CHANGED and      // TIME_CHANGED broadcasts.      Log.d(TAG, "onDisabled");      Class clazz = ExampleBroadcastReceiver.class;      PackageManager pm = context.getPackageManager();      pm.setComponentEnabledSetting(                new ComponentName("com.example.android.apis", ".appwidget.ExampleBroadcastReceiver"),                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,                PackageManager.DONT_KILL_APP);    }    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,            int appWidgetId, String titlePrefix) {      Log.d(TAG, "updateAppWidget appWidgetId=" + appWidgetId + " titlePrefix=" + titlePrefix);      // Getting the string this way allows the string to be localized.The format      // string is filled in using java.util.Formatter-style format strings.      CharSequence text = context.getString(R.string.appwidget_text_format,                ExampleAppWidgetConfigure.loadTitlePref(context, appWidgetId),                "0x" + Long.toHexString(SystemClock.elapsedRealtime()));      // Construct the RemoteViews object.It takes the package name (in our case, it's our      // package, but it needs this because on the other side it's the widget host inflating      // the layout from our package).      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider);      views.setTextViewText(R.id.appwidget_text, text);      // Tell the widget manager      appWidgetManager.updateAppWidget(appWidgetId, views);    }}
4 app widht 配置Activity处理代码
/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.android.apis.appwidget;import android.app.Activity;import android.appwidget.AppWidgetManager;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.EditText;import java.util.ArrayList;// Need the following import to get access to the app resources, since this// class is in a sub-package.import com.example.android.apis.R;/** * The configuration screen for the ExampleAppWidgetProvider widget sample. */public class ExampleAppWidgetConfigure extends Activity {    static final String TAG = "ExampleAppWidgetConfigure";    private static final String PREFS_NAME            = "com.example.android.apis.appwidget.ExampleAppWidgetProvider";    private static final String PREF_PREFIX_KEY = "prefix_";    int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;    EditText mAppWidgetPrefix;    public ExampleAppWidgetConfigure() {      super();    }    @Override    public void onCreate(Bundle icicle) {      super.onCreate(icicle);      // Set the result to CANCELED.This will cause the widget host to cancel      // out of the widget placement if they press the back button.      setResult(RESULT_CANCELED);      // Set the view layout resource to use.      setContentView(R.layout.appwidget_configure);      // Find the EditText      mAppWidgetPrefix = (EditText)findViewById(R.id.appwidget_prefix);      // Bind the action for the save button.      findViewById(R.id.save_button).setOnClickListener(mOnClickListener);      // Find the widget id from the intent.         Intent intent = getIntent();      Bundle extras = intent.getExtras();      if (extras != null) {            mAppWidgetId = extras.getInt(                  AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);      }      // If they gave us an intent without the widget id, just bail.      if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {            finish();      }      mAppWidgetPrefix.setText(loadTitlePref(ExampleAppWidgetConfigure.this, mAppWidgetId));    }    View.OnClickListener mOnClickListener = new View.OnClickListener() {      public void onClick(View v) {            final Context context = ExampleAppWidgetConfigure.this;            // When the button is clicked, save the string in our prefs and return that they            // clicked OK.            String titlePrefix = mAppWidgetPrefix.getText().toString();            saveTitlePref(context, mAppWidgetId, titlePrefix);            // Push widget update to surface with newly set prefix            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);            ExampleAppWidgetProvider.updateAppWidget(context, appWidgetManager,                  mAppWidgetId, titlePrefix);            // Make sure we pass back the original appWidgetId            Intent resultValue = new Intent();            resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);            setResult(RESULT_OK, resultValue);            finish();      }    };    // Write the prefix to the SharedPreferences object for this widget    static void saveTitlePref(Context context, int appWidgetId, String text) {      SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0).edit();      prefs.putString(PREF_PREFIX_KEY + appWidgetId, text);      prefs.commit();    }    // Read the prefix from the SharedPreferences object for this widget.    // If there is no preference saved, get the default from a resource    static String loadTitlePref(Context context, int appWidgetId) {      SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);      String prefix = prefs.getString(PREF_PREFIX_KEY + appWidgetId, null);      if (prefix != null) {            return prefix;      } else {            return context.getString(R.string.appwidget_prefix_default);      }    }    static void deleteTitlePref(Context context, int appWidgetId) {    }    static void loadAllTitlePrefs(Context context, ArrayList<Integer> appWidgetIds,            ArrayList<String> texts) {    }}
配置文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:orientation="vertical"    >    <TextView      android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:text="@string/appwidget_configure_instructions"    />    <EditText      android:id="@+id/appwidget_prefix"      android:layout_width="fill_parent"      android:layout_height="wrap_content"    />    <Button      android:id="@+id/save_button"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:text="@android:string/ok"    /></LinearLayout>
页: [1]
查看完整版本: API DEMO APPWIGHT 学习