AndroidWidget实践 --- EverydayTips开发

来源:互联网 发布:it有哪些职业 编辑:程序博客网 时间:2024/05/18 13:43

应用已经做完,来这里下载吧

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>

其实widget就是个receiver,配置的话直接把<receiver><receiver>这一段拷贝就ok了.然后修改配置文件为你的


我们看那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" 是刷新时间   其他不解释-->

我们看布局文件widget_layout.xml

<?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();      }  }  

运行  后会看到textView上的显示"少壮不努力老大徒伤悲"了


接下来是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 {@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {// TODO Auto-generated method stubsuper.onDeleted(context, appWidgetIds);}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {//widget更新执行的方法// TODO Auto-generated method stubsuper.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的内容更新}}

Tips.java的服务么有实现:只是返回一句

package com.su.tipeveryday;public class Tips {public static String getTips() {return "宝剑锋从磨砺出,梅花香自苦寒来";}}

这样我们的应用就显示宝剑这句话了



欲知后事 我先吃饭









原创粉丝点击