android开发:桌面组件AppWidgetManager

首先我们需要创建一个NewAppWidget类,需要继承父类AppWidgetProvider,AppWidgetProvider一共有4个方法:

  • public void onUpdate(Context context....
  • public void onEnabled(Context context) {...
  • public void onDisabled(Context context) {...
  • public void onDisabled(Context context) {...

我觉得看方法的名字大致上都猜出了是什么意思吧?

然后在androidmanifest的说明文件中申明如下:

<receiver android:name=".NewAppWidget" >
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>

    <meta-data
        android:name="android.appwidget.provider"
        android:resource="@xml/new_app_widget_info" />
</receiver>

请注意上面代码种红色的字体,这个是配置文件,主要的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="250dp"//宽度
    android:minHeight="180dp"//高度
    android:updatePeriodMillis="86400000"//一天更新一次
    android:previewImage="@drawable/example_appwidget_preview"//这是一张图片
    android:initialLayout="@layout/new_app_widget"//布局文件
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen"
    android:configure="com.lanxin.testwidget.MainActivity"//这里还申明了一个配置文件,在实际应用中,我们可能用不到配置文件,因为都是后台联网读取数据的,但是这里为了演示,使用配置文件比较适合.
    android:initialKeyguardLayout="@layout/new_app_widget"></appwidget-provider>

现在我们来编写NewAppWidget类的代码:

package com.lanxin.testwidget;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.util.Log;
import android.widget.RemoteViews;

/**
 * Implementation of App Widget functionality.
 */
public class NewAppWidget extends AppWidgetProvider {

    private static final String TAG = "NewAppWidget";

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // There may be multiple widgets active, so update all of them
        final int N = appWidgetIds.length;
        for (int i = 0; i < N; i++) {
            updateAppWidget(context, appWidgetManager, appWidgetIds[i]);
        }
        Log.d(TAG,"onUpdate");
    }


    @Override
    public void onEnabled(Context context) {
        // Enter relevant functionality for when the first widget is created
        PackageManager pm = context.getPackageManager();
        pm.setComponentEnabledSetting(new ComponentName("com.lanxin.testwidget",".NewAppWidget")
        ,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
        Log.d(TAG, "onEnabled");
    }

    @Override
    public void onDisabled(Context context) {
        // Enter relevant functionality for when the last widget is disabled
        PackageManager pm = context.getPackageManager();
        pm.setComponentEnabledSetting(new ComponentName("com.lanxin.testwidget",".NewAppWidget"),
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
        Log.d(TAG, "onDisabled");
    }

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) {
        ConfigEx configEx = new ConfigEx(context,"widget");
        CharSequence widgetText = configEx.getKeyStr("txt");

        // Construct the RemoteViews object
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
        views.setTextViewText(R.id.appwidget_text, widgetText);

        // Instruct the widget manager to update the widget
        appWidgetManager.updateAppWidget(appWidgetId, views);
        Log.d(TAG, "updateAppWidget");
    }
}

接着贴上配置器的代码:

package com.lanxin.testwidget;

import android.app.Activity;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RemoteViews;
import android.widget.Toast;

public class MainActivity extends Activity {

    private static final String TAG = "WidgetLog";

    EditText edit;
    Button save;
    ConfigEx mConfig;
    Context mContext;
    int mAppwidgetID;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Bundle bundle = getIntent().getExtras();
        if(bundle!=null){
            mAppwidgetID = bundle.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
            Log.d(TAG,"mAppwidgetID:"+mAppwidgetID);

        }
        init();
    }

    private void init() {
        mContext = this;
        mConfig = new ConfigEx(mContext,"widget");

        edit = (EditText)findViewById(R.id.edit);
        save = (Button)findViewById(R.id.save);

        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mConfig.putKey("txt", edit.getText().toString());
                updateWidget(AppWidgetManager.getInstance(mContext), edit.getText().toString());

                //更新完毕后,返回ID给appwidget,不然无法更新
                Intent intent = new Intent();
                intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,mAppwidgetID);
                setResult(RESULT_OK,intent);

                toast("保存成功!");
                finish();
            }
        });

    }

    private void toast(String msg){
        Toast.makeText(mContext,msg,Toast.LENGTH_LONG).show();
    }

    public void updateWidget(AppWidgetManager appWidgetManager,String str){

        //创建一个RemoteViews对象
        RemoteViews rv = new RemoteViews(mContext.getPackageName(),R.layout.new_app_widget);
        //操作对象中的内容
        rv.setTextViewText(R.id.appwidget_text,str);

        //创建一个pendingIntent对象,用来绑定时间
        //Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://lanxinbase.com"));
        Intent intent = new Intent(this,MainActivity.class);//当然,也可以打开窗口
        PendingIntent pi = PendingIntent.getActivity(mContext,0,intent,0);

        //绑定事件
        rv.setOnClickPendingIntent(R.id.but,pi);

        //执行更新
        appWidgetManager.updateAppWidget(mAppwidgetID,rv);

    }
}

下面是效果图:

4FEA.tm

 

源码:http://pan.baidu.com/s/1sl7XPiX

Leave a Comment

 
Copyright © 2008-2021 lanxinbase.com Rights Reserved. | 粤ICP备14086738号-3 |