Android桌面插件的开发
生活随笔
收集整理的這篇文章主要介紹了
Android桌面插件的开发
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
想要做個(gè)可以在桌面上顯示的插件需要3個(gè)步驟:
? 1. 繼承AppWidgetProvider
? 2. 編寫(xiě)widget的界面xml, 編寫(xiě)mywidget屬性xml
? 3. AndroidManifest.xml ?注冊(cè)插件
?
先上圖
這個(gè)案例是一個(gè)會(huì)自增的數(shù)字, 非常的簡(jiǎn)單。
?
1. 繼承AppWidgetProvider
[java] ?
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); ?
? ? } ?
??
} ?
首先我們添加一個(gè)類, 用于繼承AppWidgetProvider, 它就是用來(lái)控制我們的插件更新刪除的一些操作
這里會(huì)用到onEnabled、onUpdate、onReceive三個(gè)方法
?
? 2. 編寫(xiě)widget的界面xml, 編寫(xiě)mywidget屬性xml
layout/widget_layout.xml
[html]?
<?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> ?
?
新建一個(gè)文件夾命名xml, 再添加一個(gè)xml文件
xml/mywidget.xml
[html] ?
<?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> ? ?
?
這里設(shè)置插件的長(zhǎng)寬、刷新時(shí)間, 0為手動(dòng)刷新、以及插件的界面xml
?
? 3. AndroidManifest.xml ?注冊(cè)插件
[html]?
<!-- 注冊(cè)該插件 --> ?
? ? ? ?<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" > ?這一段是向系統(tǒng)注冊(cè)一個(gè)廣播, 我們會(huì)在邏輯處理時(shí)將該廣播發(fā)送給AppWidgetProvider的更新方法, 以實(shí)現(xiàn)手動(dòng)刷新。
?
那么完成上面三部基本上就可以顯示一個(gè)插件在桌面上了。
?
如果我們想讓插件顯示的數(shù)字每秒加一的話, 我們需要做后臺(tái)處理
[java]?
public class MyWidgetProvider extends AppWidgetProvider ?
{ ?
? ? private static Timer myTimer; ?
? ? private static int index = 0; ?
? ? ??
? ? //定義我們要發(fā)送的事件 ?
? ? 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); ?
? ? ? ? ??
? ? ? ? //在插件被創(chuàng)建的時(shí)候這里會(huì)被調(diào)用, 所以我們?cè)谶@里開(kāi)啟一個(gè)timer 每秒執(zhí)行一次 ?
? ? ? ? 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) ?
? ? { ?
? ? ? ? //當(dāng)判斷到是該事件發(fā)過(guò)來(lái)時(shí), 我們就獲取插件的界面, 然后將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) { ?
? ? ? ? ? ? ??
? ? ? ? ? ? //新建一個(gè)要發(fā)送的Intent ?
? ? ? ? ? ? mcontext = context; ?
? ? ? ? ? ? intent = new Intent(); ?
? ? ? ? ? ? intent.setAction(broadCastString); ?
? ? ? ? } ?
? ? ? ? @Override ?
? ? ? ? public void run() ?
? ? ? ? { ?
? ? ? ? ? ? System.out.println("2"); ?
? ? ? ? ? ? //發(fā)送廣播(由onReceive來(lái)接收) ?
? ? ? ? ? ? mcontext.sendBroadcast(intent); ?
? ? ? ? } ?
? ? ? ? ??
? ? } ?
}
? 1. 繼承AppWidgetProvider
? 2. 編寫(xiě)widget的界面xml, 編寫(xiě)mywidget屬性xml
? 3. AndroidManifest.xml ?注冊(cè)插件
?
先上圖
這個(gè)案例是一個(gè)會(huì)自增的數(shù)字, 非常的簡(jiǎn)單。
?
1. 繼承AppWidgetProvider
[java] ?
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); ?
? ? } ?
??
} ?
首先我們添加一個(gè)類, 用于繼承AppWidgetProvider, 它就是用來(lái)控制我們的插件更新刪除的一些操作
這里會(huì)用到onEnabled、onUpdate、onReceive三個(gè)方法
?
? 2. 編寫(xiě)widget的界面xml, 編寫(xiě)mywidget屬性xml
layout/widget_layout.xml
[html]?
<?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> ?
?
新建一個(gè)文件夾命名xml, 再添加一個(gè)xml文件
xml/mywidget.xml
[html] ?
<?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> ? ?
?
這里設(shè)置插件的長(zhǎng)寬、刷新時(shí)間, 0為手動(dòng)刷新、以及插件的界面xml
?
? 3. AndroidManifest.xml ?注冊(cè)插件
[html]?
<!-- 注冊(cè)該插件 --> ?
? ? ? ?<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" > ?這一段是向系統(tǒng)注冊(cè)一個(gè)廣播, 我們會(huì)在邏輯處理時(shí)將該廣播發(fā)送給AppWidgetProvider的更新方法, 以實(shí)現(xiàn)手動(dòng)刷新。
?
那么完成上面三部基本上就可以顯示一個(gè)插件在桌面上了。
?
如果我們想讓插件顯示的數(shù)字每秒加一的話, 我們需要做后臺(tái)處理
[java]?
public class MyWidgetProvider extends AppWidgetProvider ?
{ ?
? ? private static Timer myTimer; ?
? ? private static int index = 0; ?
? ? ??
? ? //定義我們要發(fā)送的事件 ?
? ? 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); ?
? ? ? ? ??
? ? ? ? //在插件被創(chuàng)建的時(shí)候這里會(huì)被調(diào)用, 所以我們?cè)谶@里開(kāi)啟一個(gè)timer 每秒執(zhí)行一次 ?
? ? ? ? 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) ?
? ? { ?
? ? ? ? //當(dāng)判斷到是該事件發(fā)過(guò)來(lái)時(shí), 我們就獲取插件的界面, 然后將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) { ?
? ? ? ? ? ? ??
? ? ? ? ? ? //新建一個(gè)要發(fā)送的Intent ?
? ? ? ? ? ? mcontext = context; ?
? ? ? ? ? ? intent = new Intent(); ?
? ? ? ? ? ? intent.setAction(broadCastString); ?
? ? ? ? } ?
? ? ? ? @Override ?
? ? ? ? public void run() ?
? ? ? ? { ?
? ? ? ? ? ? System.out.println("2"); ?
? ? ? ? ? ? //發(fā)送廣播(由onReceive來(lái)接收) ?
? ? ? ? ? ? mcontext.sendBroadcast(intent); ?
? ? ? ? } ?
? ? ? ? ??
? ? } ?
}
總結(jié)
以上是生活随笔為你收集整理的Android桌面插件的开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: html span自动换行,span标签
- 下一篇: Android:H5 通过 URL Sc