ONE Goal,ONE Passion !
widget---桌面小控件.大多使用与天气应用等控件(墨迹天气).一般用来实时更新service中的获取的最新数据.
1, 写一个广播接收者继承AppWidgetProvider(AppWidgetProvider继承自BroadcastReceiver).2,在清单文件中配置这个广播接收者3,重写onEnabled等方法.4,[一般开启服务,在服务中去处理widget的点击事件]
public class MyWidgetReceiver 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);
Intent service =
new Intent(context, WidgetService.class);
context.startService(service);
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
Intent service =
new Intent(context, WidgetService.class);
context.stopService(service);
}
}
第二步: 在清单文件中配置
a.清单中配置
// name : 我们创建的广播接收者的名称
<receiver android:name="com.example.widgetdemo.MyWidgetReceiver" >
// intent-filter : 要接收的广播的频道(固定写法)
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
// resource: widget显示的布局资源
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_provider" />
</receiver>
当我们配置后系统会帮助我们创建widget.
b.在res下创建xml文件夹,在xml文件中创建一个widget_provider.xml文件
initialLayout: widget显示布局
minHeight : 显示的最小高度
minWidth : 显示的最小宽度
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/process_widget"
android:minHeight="72.0dip"
android:minWidth="294.0dip"
android:updatePeriodMillis="0" />
现在widget已经可以显示了.只是这个widget仅仅能显示布局.
public class WidgetService extends Service {
AppWidgetManager am;
@Override
public IBinder
onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent,
int flags,
int startId) {
updateWidget();
return super.onStartCommand(intent, flags, startId);
}
public void updateWidget() {
am = AppWidgetManager.getInstance(
this);
/**
* 更新widget调用方法 ComponentName---四大组件的封装类
* am.updateAppWidget(ComponentName provider, RemoteViews views)
*/
/**
* RemoteViews --- 远程view A class that describes a view hierarchy that
* can be displayed in another process. The hierarchy is inflated from a
* layout resource file, and this class provides some basic operations
* for modifying the content of the inflated hierarchy.
*/
ComponentName provider =
new ComponentName(getApplicationContext(),
MyWidgetReceiver.class);
RemoteViews views =
new RemoteViews(getPackageName(),
R.layout.process_widget);
views.setTextViewText(R.id.process_count,
"5 个应用");
views.setTextViewText(R.id.process_memory,
"200M");
Intent intent =
new Intent();
intent.setAction(
"widget.clear.notify");
PendingIntent pendingIntent = PendingIntent.getBroadcast(
getApplicationContext(),
88, intent,
PendingIntent.FLAG_ONE_SHOT);
/**
* setOnClickPendingIntent(int viewId, PendingIntent pendingIntent)
* viewId---响应点击事件的控件id pendingIntent--- 要执行的PendingIntent
*/
views.setOnClickPendingIntent(R.id.btn_clear, pendingIntent);
am.updateAppWidget(provider, views);
}
}
好了.widget已经可以操作了. 注: 如果是开启activity.注意将要启动的activity的启动方式更改为
android:launchMode=
"singleTask"
以防点击widget后进入activity后需要点击2此返回键才能退出.
转载请注明原文地址: https://ju.6miu.com/read-1296607.html