应用已经做完,来这里下载吧
http://static.apk.hiapk.com/html/2012/05/611477.html?module=256&info=z2vlZQBO5VM%3D
忙完了手底下的一下事情 闲来无事学习一下Widget的用法,说来惭愧,开发这么久没有做过Widget的东西,那就从零开始也算可以给后来人参考吧
首先是我要开发的东西:EveryDayTips 类似于android自带的那个Tips吧,不过我们的应用是用来显示名言警句的,算是个提醒左右吧.大体功能:
在桌面以widget的形式显示名言警句
用户可以自定义每隔多少时间更新一次widget
widget更新的时候将通过notification发送到状态栏
点击widget可以打开Activity或者一个对话框复制这个警句一共分享等等
初步的逻辑和界面
那么我们就开始编写了
首先是新建工程
然后是配置Manifest
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.su.tipeveryday" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".TipEveryDayActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".TipEveryDayWidget" android:label="AAAAAAAATip"> <intent-filter > <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_config" /><!-- 这个是widget的配置文件,出来这个之外其他的不用管直接copy --> </receiver> </application> </manifest>
我们看那xml下的配置文件
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:configure="com.su.tipeveryday.TipEveryDayActivity" android:initialLayout="@layout/widget_layout" android:minHeight="72dp" android:minWidth="280dp" android:updatePeriodMillis="86400000" > </appwidget-provider> <!-- android:initialLayout是widget的布局文件 android:updatePeriodMillis="86400000" 是刷新时间 其他不解释-->
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/textViewWidget" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/widget" android:text="少壮不努力,老大徒伤悲" /> </LinearLayout>和activity的布局基本没区别
把资源文件放到drawable后我们编写Activity的代码
其实也是个框架 在这个基础上写就行了
package com.su.tipeveryday; import android.app.Activity; import android.appwidget.AppWidgetManager; import android.content.Intent; import android.os.Bundle; import android.util.Log; public class TipEveryDayActivity extends Activity { int mAppWidgetId; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); Log.i("myLog"," on WidgetConf ... "); setResult(RESULT_CANCELED); // Find the widget id from the intent. Intent intent = getIntent(); Bundle extras = intent.getExtras(); if (extras != null) { mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); Log.i("TTTTT", mAppWidgetId+"");//这个返回的屏幕上的widgetID,没增加一个会加一 我的模拟器是19,应该是有保留ID? } // If they gave us an intent without the widget id, just bail. if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { finish(); } // return OK Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); setResult(RESULT_OK, resultValue); finish(); } }
接下来是widget里代码的编写了
package com.su.tipeveryday; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.util.Log; import android.widget.RemoteViews; import android.widget.TextView; public class TipEveryDayWidget extends AppWidgetProvider { @Override public void onDeleted(Context context, int[] appWidgetIds) { // TODO Auto-generated method stub super.onDeleted(context, appWidgetIds); } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {//widget更新执行的方法 // TODO Auto-generated method stub super.onUpdate(context, appWidgetManager, appWidgetIds); final int N = appWidgetIds.length; Log.d("app", "onUpdate--->Ids===" + String.valueOf(N)); for (int i = 0; i < N; i++) {//如果有很多同类widget是需要遍历的(他们的id是不同的) int appWidgetId = appWidgetIds[i]; updateAppWidget(context, appWidgetManager, appWidgetId);//更新widget的方法 } } private void updateAppWidget(Context context,AppWidgetManager appWidgetManager, int appWidgetId) { String tip = Tips.getTips();//从Tips.java 获取警句 RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); views.setTextViewText(R.id.textViewWidget, tip); appWidgetManager.updateAppWidget(appWidgetId, views);//把widget的内容更新 } }
package com.su.tipeveryday; public class Tips { public static String getTips() { return "宝剑锋从磨砺出,梅花香自苦寒来"; } }
欲知后事 我先吃饭