谁(以及如何)创建AppWidgetProvider的实例?

时间:2013-03-27 17:30:18

标签: android android-widget

UPD2。在一种黑魔法例程(卸载,清理Eclipse项目,重启Android设备,重建,安装,运行)之后问题已经消失。它没有解决,它已经消失了。有人可以解释一下发生了什么吗?

UPD。似乎,我的Android小部件项目中没有运行任何Java代码,模仿Hello Widget教程(参考评论)。有没有办法运行一些代码来使我的小部件有用?我相信它是可能的,因为有很多做什么小工具。他们是如何做到的?

我在Hello Widget教程之后建模了一个简单的Android小部件:http://nm-blog.sanid.com/2009/07/android-hellowidget-tutorial/

运行它我可以看到它根本不起作用 - 文本视图没有改变。

以下是一些代码:

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.pell.hellowidget"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >        
        <receiver android:name="HelloWidgetProvider" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/hello_widget_provider" />
        </receiver>                
    </application>
</manifest>

RES / XML / hello_widget_provider.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
  android:minWidth="280dp"
  android:minHeight="180dp"
  android:updatePeriodMillis="10000"
  android:initialLayout="@layout/hello_widget_layout"
  android:resizeMode="vertical" />

RES /布局/ hello_widget_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical|center_horizontal"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>

的src / COM /佩尔/ HelloWidget的/ HelloWidgetProvider.java:

package com.pell.hellowidget;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.widget.RemoteViews;

public class HelloWidgetProvider extends AppWidgetProvider {
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1,
                1000);

        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }

    private Date currentTime;

    private class MyTime extends TimerTask {
        RemoteViews remoteViews;
        AppWidgetManager appWidgetManager;
        ComponentName thisWidget;
        DateFormat format = SimpleDateFormat.getTimeInstance(
                SimpleDateFormat.MEDIUM, Locale.getDefault());

        public MyTime(Context context, AppWidgetManager appWidgetManager) {
            this.appWidgetManager = appWidgetManager;
            remoteViews = new RemoteViews(context.getPackageName(),
                    R.layout.hello_widget_layout);
            thisWidget = new ComponentName(context, HelloWidgetProvider.class);
        }

        @Override
        public void run() {
            currentTime = new Date();
            remoteViews.setTextViewText(R.id.textView1,
                    format.format(currentTime));
            appWidgetManager.updateAppWidget(thisWidget, remoteViews);
        }
    }
}

据我所知,由于没有人实例化com.pell.hellowidget.HelloWidgetProvider对象,因此无法正常工作。什么是入口点的Java / Android Widget / etc模拟(int main(int argc,char * argv []),WinMain等)?谁(以及如何)实例化AppWidgetProvider对象?

1 个答案:

答案 0 :(得分:0)

根据你的最终评论,。在android:name中有时可能是必不可少的。通常,我总是在清单中使用完全限定名称(“com.super.cool.thing.MySpecialClassActivity”),因为它非常清楚。

AppWidget的“入口点”是提供者类。但是,它仅在被调用时被实例化,并且一旦onUpdate(或onDestroy)返回,该类就会消失。虽然(我认为)你可以做你已经完成的事情,但这不是一个好习惯 - 通常你应该创建一个定义的单独线程来管理你的小部件,Service,{{1 },AsyncTask等。

通常,Thread方法将创建一个旨在启动将控制窗口小部件的Service类的intent。这方面的一个例子是http://www.vogella.com/articles/AndroidWidgets/article.html,特别是第8节。我只会在该教程中提出一点意见:通常建议不要使用updatePeriod。我还在Service being re-Created by AlarmManager中对服务和其他内容的使用进行了一些考虑。