1、布局activity_main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:gravity="center"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button1"/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button2"/>
</LinearLayout>
</LinearLayout>
2、配置文件meta.xml
Root element写
appwidget-provider
布局占几个格子是有公式的
70N-30
如果我们的小部件是一个4X1的布局,那么,
70x4-30=250
70x1-30=40
所以最终meta.xml
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="250dp"
android:minHeight="40dp"
android:initialLayout="@layout/activity_main"
>
</appwidget-provider>
3、控制器MyappWidget
MyappWidget 必须extends AppWidgetProvider
4、别忘记在AndroidManifest中注册
<receiver android:name=".MyappWidget">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/meta"
/>
</receiver>
运行程序后,就可以使用这个小部件了
下面重点来看MyappWidget
需要重写4个方法
public class MyappWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.i("info","onUpdate...");
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
Log.i("info","onDeleted...");
}
@Override
public void onEnabled(Context context) {
Log.i("info","onEnabled...");
}
@Override
public void onDisabled(Context context) {
Log.i("info","onDisabled...");
}
}
/**
* AppWidget控制类
*/
public class MyappWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.i("info","onUpdate..."+ Arrays.toString(appWidgetIds));
//manager
//remoteviews
//updateAppWidget
RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.activity_main);
views.setTextColor(R.id.tv, Color.RED);
views.setTextViewText(R.id.tv,"Hello world");
appWidgetManager.updateAppWidget(appWidgetIds,views);
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
Log.i("info","onDeleted..."+ Arrays.toString(appWidgetIds));
}
@Override
public void onEnabled(Context context) {
Log.i("info","onEnabled...");
}
@Override
public void onDisabled(Context context) {
Log.i("info","onDisabled...");
}
}
现在实现点击按钮1打开Activity
//给button1添加点击意图
Intent intent = new Intent(context,MainActivity.class);
PendingIntent pi1 = PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.btn1,pi1);
现在点击button2让textview改变随机一个颜色
//给button2添加点击意图,发送自定义广播
Intent i2 = new Intent("ACTION_BUTTON2_CLICKED");
i2.setComponent(new ComponentName(context,MyappWidget.class));
PendingIntent pi2 = PendingIntent.getBroadcast(context,0,i2,PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.btn2,pi2);
appWidgetManager.updateAppWidget(appWidgetIds,views);
AndroidManifest.xml中注册,由于MyappWidget父类是BroadcastReceiver,所以直接注册
<receiver android:name=".MyappWidget">
<intent-filter>
<action android:name="ACTION_BUTTON2_CLICKED"/>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/meta"
/>
</receiver>
MyappWidget中重写onReceive方法
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.i("info","onUpdate..."+ Arrays.toString(appWidgetIds));
//manager
//remoteviews
//updateAppWidget
RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.activity_main);
views.setTextColor(R.id.tv, color);
views.setTextViewText(R.id.tv,"Hello world");
//给button1添加点击意图
Intent intent = new Intent(context,MainActivity.class);
PendingIntent pi1 = PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.btn1,pi1);
//给button2添加点击意图,发送自定义广播
Intent i2 = new Intent("ACTION_BUTTON2_CLICKED");
i2.setComponent(new ComponentName(context,MyappWidget.class));
PendingIntent pi2 = PendingIntent.getBroadcast(context,0,i2,PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.btn2,pi2);
appWidgetManager.updateAppWidget(appWidgetIds,views);
}