利用widget實現(xiàn)一個時鐘功能小插件
一般來說 widget 程序由以下部分組成:
a. AppWidgetProvider 的實現(xiàn)
b. widget外觀布局定義文件
c. widget 參數(shù)配置文件
d.服務(wù)的實現(xiàn)
e.androidManifest.xml文件配置
a.寫一個類繼承AppWidgetProvider
public class TonyAppWidgetProvider extends AppWidgetProvider {
private final static String TAG = "TonyAppWidgetProvider";
/**
* 1:在xml文件中android:updatePeriodMillis="86400000"只能精確到分 ?不滿足我們的要
*:2:當我們用戶每添加一個appwidget就會調(diào)用一次
*/
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.e(TAG, "onUpdate");
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
/**
* 在沒有 appwidget ?當用戶初次添加appwidget的時候調(diào)用
* 1:做一些初始化的工作
* 2:打開數(shù)據(jù)庫
* 3:啟動服務(wù)
*
*/
public void onEnabled(Context context) {
super.onEnabled(context);
Log.e(TAG, "onEnabled");
Intent intent = new Intent(context, TonyAppWidgetService.class);
context.startService(intent);
}
/**
* 用戶每刪除一個appwidget就會調(diào)用一次
*/
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
Log.e(TAG, "onDeleted");
super.onDeleted(context, appWidgetIds);
}
/**
* 最后一個appwidget刪除時調(diào)用
*/
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
Log.e(TAG, "onDisabled");
}
}
=================================================================
b.widget外觀布局定義文件纯蛾,添加一個布局文件,文件取名為:tony_appwidget
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_red_light"
android:text="TextView" />
=========================================================================
c. widget 參數(shù)配置文件
建一個名為xml的文件夾纵隔,并且在此文件夾建一個.xml文件取名為tony_appwidget_info
android:minWidth="294dp"
android:minHeight="72dp"
android:previewImage="@mipmap/ic_launcher"
android:initialLayout="@layout/tony_appwidget"
android:resizeMode="horizontal|vertical">
android:minWidth="294dp" ? appwidget最小的寬度
android:minHeight="72dp" ? appwidget最小的高度
android:updatePeriodMillis="86400000" ?appwidget 更新的時間 不能精確到秒 ?一般最小的精度是分
問題:怎么控制更新的時間 ?翻诉,代碼中控制
android:previewImage="@drawable/ic_launcher" ?預(yù)覽圖片
android:initialLayout="@layout/example_appwidget" ?當我們添加一個appwidget時的布局
當我們添加一個appwidget自動啟動的Activity的名字
android:configure="com.example.android.ExampleAppWidgetConfigure"
重置appwidget的大小時的模式:表示可以水平 垂直拉伸
android:resizeMode="horizontal|vertical">
-->
======================================================================================================
d.服務(wù)的實現(xiàn)
創(chuàng)建一個文件TonyAppWidgetService繼承Service
public class TonyAppWidgetService extends Service {
private AppWidgetManager am;
//方式1:Handler + Runnable
private Handler handler=new Handler();
private Runnable runnable=new Runnable() {
@Override
public void run() {
//獲取系統(tǒng)的時間炮姨,并更新appwidget視圖
//RemoteView :不是當前應(yīng)用的視圖 ?屬于其他的應(yīng)用程序
RemoteViews remoteViews=new RemoteViews(getPackageName(),R.layout.tony_appwidget);
//獲取當前時間
String time=new Date().toLocaleString();
//設(shè)置顯示
remoteViews.setTextViewText(R.id.tv_time,time);
//隨機改變字體的顏色
Random rd = new Random();
remoteViews.setTextColor(R.id.tv_time, Color.rgb(255, 255, rd.nextInt(256)));
ComponentName componentName=new ComponentName(getApplicationContext(),TonyAppWidgetProvider.class);
am.updateAppWidget(componentName,remoteViews);
//點擊 ?發(fā)送一個意圖 ?PendingIntent ?延遲意圖
Intent intent = new Intent(getApplicationContext(), MyNote.class);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 100, intent, 0);
remoteViews.setOnClickPendingIntent(R.id.tv_time, pendingIntent);
handler.postDelayed(runnable,1000);
}
};
public IBinder onBind(Intent intent) {
return null;
}
public int onStartCommand(Intent intent, int flags, int startId) {
am = AppWidgetManager.getInstance(this);
handler.post(runnable);
//啟動定時器
return super.onStartCommand(intent, flags, startId);
}
}
=======================================================================================================
e.配置androidManifest.xml文件
android:name="android.appwidget.provider"
android:resource="@xml/tony_appwidget_info" />