Android 开发之简单的Widget

开发一个简单的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"/>
posted @ 2016-08-17 09:47  shadowxs  阅读(61)  评论(0)    收藏  举报