Android开发学习
Android开发中,需要创建一些桌面小工具。
新建布局文件:activity_main.xml,代码内容:(工具上面显示的内容布局)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/main" > <!-- Relativelayout 的 android:background请自行更换你的图片 --> <TextView android:id="@+id/textview_1" android:layout_width="60.0dp" android:layout_height="90.0dp" android:layout_marginLeft="35.0dp" android:layout_marginTop="34.0dp" android:text="" android:textColor="#000000" /> <ImageView android:id="@+id/imageview_1" android:layout_width="136.0dp" android:layout_height="92.0dp" android:layout_marginLeft="5.0dp" android:layout_marginTop="42.0dp" android:layout_toRightOf="@+id/textview_1" /> <Button android:id="@+id/button_1" android:layout_width="50.0dp" android:layout_height="20.0dp" android:layout_below="@+id/textview_1" android:layout_marginLeft="35.0dp" android:layout_marginTop="10.0dp" android:text="详情" /> <!-- 本人的程序用了android:background="@drawable/mybutton",为了简化示例在此不使用 --> </RelativeLayout>
新建布局文件:mywidget.xml,代码内容:
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/activity_main" android:minHeight="110.0dp" android:minWidth="250.0dp" android:resizeMode="horizontal" android:updatePeriodMillis="86400000" android:widgetCategory="home_screen|keyguard" > </appwidget-provider>
实现的MyAppWidgetProvider.java代码如下:(显示具体工具上的内容填充)
package com.zhengdecai.mywidget; import java.util.HashSet; import java.util.Iterator; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.util.Log; import android.widget.RemoteViews; import android.widget.Toast; /** * 桌面工具 * * @author 郑德才 * */ public class MyAppWidgetProvider extends AppWidgetProvider{ private static final Intent AppWidget_Service=new Intent("com.feature.test.MyAppWidgetService"); //保存WidgetId HashSet 可能有用户创建了多个Widget private static HashSet<Integer> hashSet=new HashSet<Integer>(); //图片资源,作者请自行修改成自己的图片 private static final int[] ResId={R.drawable.a1,R.drawable.a2,R.drawable.a3,R.drawable.a4,R.drawable.a5}; //文本资源 private static final String[] intro={"神挡杀神,佛挡杀佛","仿佛兮若轻云之蔽月,飘飘兮若流风之回雪", "此乃驱狼吐虎之计,敬你之手他一搏吧","汝等小儿,可敢杀我", "汝等看好了"}; private static int iCur=-1; //周期更新时调用 @Override public void onUpdate(Context context,AppWidgetManager appWidgetProvider,int[] appWidgetIds) { Log.v("创建Widget", "OK"); // 每次 widget 被创建时,对应的将widget的id添加到set中 for(int id:appWidgetIds) hashSet.add(Integer.valueOf(id)); } //当桌面组件删除时调用 @Override public void onDeleted(Context context,int[] appWidgetIds) { for(int id:appWidgetIds) hashSet.remove(id); super.onDeleted(context, appWidgetIds); } //当桌面提供的第一个组件创建时调用 @Override public void onEnabled(Context context) { //启动服务 context.startService(AppWidget_Service); super.onEnabled(context); } //当桌面提供的最后一个组件删除时调用 @Override public void onDisabled(Context context) { //停止服务 context.stopService(AppWidget_Service); super.onDisabled(context); } /* * 重写广播接收方法 * 用于接收除系统默认的更新广播外的 自定义广播(本程序由服务发送过来的,一个是更新UI,一个是按钮事件消息) */ @Override public void onReceive(Context context,Intent intent) { String getAction=intent.getAction(); if(getAction.equals(Constant.ACTION_UPDATE_ALL)) { //更新广播 updateAllWidget(context,AppWidgetManager.getInstance(context), hashSet); } else if(intent.hasCategory(Intent.CATEGORY_ALTERNATIVE)) { Uri data=intent.getData(); Log.v("button",data.toString()+" "); int buttonid=Integer.parseInt(data.getSchemeSpecificPart()); Toast.makeText(context, intro[buttonid],Toast.LENGTH_SHORT).show(); } super.onReceive(context, intent); } //更新UI public void updateAllWidget(Context context,AppWidgetManager manager,HashSet<Integer> set) { int AppId; Iterator iterator=set.iterator(); iCur=iCur+1>=intro.length? 0: iCur+1; while(iterator.hasNext()) { AppId=((Integer)iterator.next()).intValue(); RemoteViews remoteViews=new RemoteViews(context.getPackageName(),R.layout.activity_main); //设置显示的文字图片 remoteViews.setTextViewText(R.id.textview_1, intro[iCur]); remoteViews.setImageViewResource(R.id.imageview_1, ResId[iCur]); //添加按钮事件处理 remoteViews.setOnClickPendingIntent(R.id.button_1, getPendingIntent(context, iCur)); //更新 manager.updateAppWidget(AppId, remoteViews); } } //设置按钮事件处理 private PendingIntent getPendingIntent(Context context,int buttonid) { Intent intent=new Intent("test.test"); intent.setClass(context, MyAppWidgetProvider.class); intent.addCategory(Intent.CATEGORY_ALTERNATIVE); intent.setData(Uri.parse("custom:"+buttonid)); //进行广播 PendingIntent pi=PendingIntent.getBroadcast(context, 0, intent, 0); return pi; } }
实现的MyAppWidgetService.java代码如下:
package com.zhengdecai.mywidget; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.IBinder; /** * 工具服务更新 * * @author 郑德才 * */ public class MyAppWidgetService extends Service { private Context context; // 更新周期 private static final int UPDATE_TIME = 5000; // 周期性更新的Widget 线程 private WidgetThread widgetThread; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { widgetThread = new WidgetThread(); widgetThread.start(); context = this.getApplicationContext(); super.onCreate(); } @Override public void onDestroy() { if (widgetThread != null && widgetThread.isAlive()) widgetThread.interrupt(); super.onDestroy(); } private class WidgetThread extends Thread { @Override public void run() { try { while (true) { Intent intent = new Intent(Constant.ACTION_UPDATE_ALL); context.sendBroadcast(intent); sleep(UPDATE_TIME); } } catch (InterruptedException error) { // 将 InterruptedException 定义在while循环之外,意味着抛出 // InterruptedException 异常时,终止线程。 } } } }
实现运行效果图:
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。