android widget 桌面外掛的簡單事例講解
阿新 • • 發佈:2019-02-10
想要做個可以在桌面上顯示的外掛需要3個步驟:
1. 繼承AppWidgetProvider
2. 編寫widget的介面xml, 編寫mywidget屬性xml
3. AndroidManifest.xml 註冊外掛
先上圖
這個案例是一個會自增的數字, 非常的簡單。
1. 繼承AppWidgetProvider
public class MyWidgetProvider extends AppWidgetProvider { private static Timer myTimer; private static int index = 0; private final String broadCastString = "knowheart.wd.appWidgetUpdate"; @Override public void onDeleted(Context context, int[] appWidgetIds) { // TODO Auto-generated method stub super.onDeleted(context, appWidgetIds); } @Override public void onEnabled(Context context) { // TODO Auto-generated method stub super.onEnabled(context); } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // TODO Auto-generated method stub super.onUpdate(context, appWidgetManager, appWidgetIds); } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); } }
首先我們新增一個類, 用於繼承AppWidgetProvider, 它就是用來控制我們的外掛更新刪除的一些操作
這裡會用到onEnabled、onUpdate、onReceive三個方法
2. 編寫widget的介面xml, 編寫mywidget屬性xml
layout/widget_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="#000000" android:layout_gravity="center_horizontal" android:layout_width="300dp" android:layout_height="wrap_content"> <TextView android:id="@+id/update" android:text="0" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" /> </LinearLayout>
新建一個資料夾命名xml, 再新增一個xml檔案
xml/mywidget.xml
<?xml version="1.0" encoding="UTF-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="300dip" android:minHeight="72dp" android:updatePeriodMillis="86400000" android:initialLayout="@layout/widget_layout" > </appwidget-provider>
這裡設定外掛的長寬、重新整理時間, 0為手動重新整理、以及外掛的介面xml
3. AndroidManifest.xml 註冊外掛
<!-- 註冊該外掛 -->
<receiver android:name="MyWidgetProvider" >
<intent-filter >
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="com.wd.appWidgetUpdate" >
</action>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/mywidget" />
</receiver>
<action android:name="com.wd.appWidgetUpdate" > 這一段是向系統註冊一個廣播, 我們會在邏輯處理時將該廣播發送給AppWidgetProvider的更新方法, 以實現手動重新整理。
那麼完成上面三部基本上就可以顯示一個外掛在桌面上了。
如果我們想讓外掛顯示的數字每秒加一的話, 我們需要做後臺處理
public class MyWidgetProvider extends AppWidgetProvider
{
private static Timer myTimer;
private static int index = 0;
//定義我們要傳送的事件
private final String broadCastString = "com.wd.appWidgetUpdate";
@Override
public void onDeleted(Context context, int[] appWidgetIds)
{
// TODO Auto-generated method stub
super.onDeleted(context, appWidgetIds);
System.out.println("onDeleted");
}
@Override
public void onEnabled(Context context)
{
System.out.println("onEnabled");
// TODO Auto-generated method stub
super.onEnabled(context);
//在外掛被建立的時候這裡會被呼叫, 所以我們在這裡開啟一個timer 每秒執行一次
MyTask mMyTask = new MyTask(context);
myTimer = new Timer();
myTimer.schedule(mMyTask, 1000, 1000);
System.out.println("onEnabled2");
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds)
{
System.out.println("onUpdate");
// TODO Auto-generated method stub
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
@Override
public void onReceive(Context context, Intent intent)
{
//當判斷到是該事件發過來時, 我們就獲取外掛的介面, 然後將index自加後傳入到textview中
System.out.println("onReceive");
if(intent.getAction().equals(broadCastString))
{
index++;
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
rv.setTextViewText(R.id.update, Integer.toString(index));
//將該介面顯示到外掛中
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName componentName = new ComponentName(context,MyWidgetProvider.class);
appWidgetManager.updateAppWidget(componentName, rv);
}
// TODO Auto-generated method stub
super.onReceive(context, intent);
}
class MyTask extends TimerTask
{
private Context mcontext = null;
private Intent intent = null;
public MyTask(Context context) {
//新建一個要傳送的Intent
mcontext = context;
intent = new Intent();
intent.setAction(broadCastString);
}
@Override
public void run()
{
System.out.println("2");
//傳送廣播(由onReceive來接收)
mcontext.sendBroadcast(intent);
}
}
}
最後, 附上工程原始碼: