0

更新2。问题出现在某种黑魔法例程(卸载、清理 Eclipse 项目、重新启动 Android 设备、重建、安装、运行)之后。它没有解决,它已经消失了。谁能解释发生了什么?

更新。似乎,在我的 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/layout/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/pell/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 对象,因此它不起作用。入口点(int main(int argc, char * argv[])、WinMain 等)的 Java/Android Widget/etc 模拟是什么?谁(以及如何)实例化 AppWidgetProvider 对象?

4

1 回答 1

0

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

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

通常,该onUpdate方法将创建一个旨在启动一个服务类的意图,该服务类将控制小部件。这方面的一个例子是http://www.vogella.com/articles/AndroidWidgets/article.html,特别是第 8 节。我只会在该教程中狡辩一点:通常建议不要使用 updatePeriod。我还在由 AlarmManager 重新创建的 Service 中考虑了使用 Services 和其他东西的一些注意事项。

于 2013-03-27T18:59:04.527 回答