0

upd2. この問題は、一種のブラック マジック ルーチン (アンインストール、Eclipse プロジェクトのクリーン、Android デバイスの再起動、再構築、インストール、実行) の後で発生しました。それは解決されていません、それはなくなりました。何が起こったのか誰か説明してくれませんか?

更新。Hello Widget チュートリアル (参照コメント) をモデルにした Android ウィジェット プロジェクトでは、Java コードがまったく実行されていないようです。ウィジェットを便利にするコードを実行する方法はありますか? 何かをするためのウィジェットがたくさんあるので、それは可能だと思います。彼らはどのようにそれを作るのですか?

Hello Widget チュートリアルの後、単純な Android ウィジェットをモデル化しました: http://nm-blog.sanid.com/2009/07/android-helloidget-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.helloidget.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メソッドは、ウィジェットを制御する Service クラスを開始するように設計されたインテントを作成します。この例はhttp://www.vogella.com/articles/AndroidWidgets/article.html、特にセクション 8 にあります。そのチュートリアルで 1 点だけ言いたいことがあります。通常、updatePeriod を使用しないことをお勧めします。また、 Serviceとその他のものを一緒に使用するためのいくつかの考慮事項を、Service being re-Created by AlarmManager にまとめました。

于 2013-03-27T18:59:04.527 に答える