Android Widget 的制作

一、生成Widget控件

1.写一个类:MyWidget extends AppWidgetProvider

2.注册: 

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

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

 

3.在 res/xml 下写一个:appwidget_info.xml  

    <?xml version="1.0" encoding="utf-8"?>
    <appwidget-provider
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:minWidth="294dp"
        android:minHeight="72dp"
        android:updatePeriodMillis="1800000"
        android:initialLayout="@layout/process_widget"
        >
    </appwidget-provider>

 

4.写一个Widget相应的布局  process_widget.xml

 

二、事件 --- 用到PendingIntent和RemoteViews

1.PendingIntent:主要用来设置桌面程序的相应方式。此对象可以有三种Intent方式,  

  1)开始一个新的Activity  

  2)发送一个广播  

  3)开始一个service

2.RemoteViews:因为桌面程序和app程序不是属于一个进程,不能通过正常的操作控件的方式来操作.       

            需要使用系统提供的RemoteViews对象来操作桌面程序.在这个类中有设置APP Widget中控件属性的方法.

3.在MyWidget中:

    // 在第一个widget被拖到屏幕上时调用 --- 可以用来开启后台服务
    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
    }

    // 在最后一个widget被移除的时候调用 --- 可以用来关闭后台服务
    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
    }

    // 在到达指定的更新时间之后或者向桌面添加App widget实例时调用 --- 可以用来重启服务,防止服务被用户关了
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }

 

4.在UpdateWidgetService中:

    //设置更新的组件
        ComponentName provider = new ComponentName(UpdateWidgetService.this, MyWidget.class);

    //获得RemoteViews对象 
    RemoteViews views = new RemoteViews(getPackageName(), R.layout.process_widget);
    views.setTextViewText(R.id.textView_widget_process_count, "正在运行的进程:" + SystemInfoUtils.getRunningProcessCount(getApplicationContext()) + "个");

    //描述一个动作,由另外一个应用进程执行
    //自定义一个广播事件,杀死后台进程,广播注册时的action是com.baymax.detector.killall
    Intent intent = new Intent();
    intent.setAction("com.baymax.detector.killall");
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    views.setOnClickPendingIntent(R.id.btn_clear, pendingIntent);

    AppWidgetManager awm = AppWidgetManager.getInstance(this);
    awm.updateAppWidget(provider, views);

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。