开发一个简单的Widget
Android桌面插件的开发:
- class
- xml
- AndroidManifest
class
AppWidgetProvider
public class MyAppWidgetProvider extends AppWidgetProvider {
private static final String TAG = "AppWidgetProvider";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
Log.w(TAG, "onUpdate method called");
ComponentName thisWidget = new ComponentName(context,
MyAppWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
Intent intent = new Intent(context.getApplicationContext(),
RequestService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
context.startService(intent);
}
@Override
public void onAppWidgetOptionsChanged(Context context,
AppWidgetManager appWidgetManager, int appWidgetId,
Bundle newOptions) {
Log.d(TAG, "onAppWidgetOptionsChanged");
super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId,
newOptions);
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
Log.d(TAG, "onDeleted(): appWidgetIds.length=" + appWidgetIds.length);
super.onDeleted(context, appWidgetIds);
}
}
Service
public class RequestService extends Service {
private static final String TAG = "RequestService";
private String tt1, tt2, tt3;
private RemoteViews remoteViews;
private AppWidgetManager appWidgetManager;
private int[] allWidgetIds;
private Context mContext;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.w(TAG, "RequestService called");
mContext = getApplicationContext();
remoteViews = new RemoteViews(this
.mContext.getPackageName(),
R.layout.appwidget);
appWidgetManager = AppWidgetManager.getInstance(this.mContext);
allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
// 监听点击事件
Intent clickIntent = new Intent(this.mContext,
MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, clickIntent, 0);
remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent);
doSomething();
return START_NOT_STICKY;
}
//自定义刷新时间
private void startAlarm() {
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
long triggerAtTime = SystemClock.elapsedRealtime() + 1000 * 10;
Intent i = new Intent(this, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
//>Android4.4
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
manager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
}
}
private void doSomething() {
//刷新插件显示内容
for (int widgetId : allWidgetIds) {
remoteViews.setTextViewText(R.id.title1, tt1);
remoteViews.setTextViewText(R.id.title2, tt2);
remoteViews.setTextViewText(R.id.title3, tt3);
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
xml
res/xml/appwidget_info.xml
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minHeight="120dp"
android:minWidth="300dp"
android:updatePeriodMillis="86400000"//刷新周期
android:previewImage="@mipmap/ic_launcher"
android:initialLayout="@layout/appwidget"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen|keyguard">
</appwidget-provider>
res/layout/appwidget.xml
桌面插件的布局文件,需要什么加什么;
AndroidManifest
<receiver
android:name=".widget.MyAppWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="com.example.widget.UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/appwidget_info" />
</receiver>
<service android:name=".RequestService"/>