0

アプリのダッシュクロック拡張機能を作成しようとしています。基本的に、私のアプリのメイン アクティビティはセンサーからデータを読み取り、それを表示します。現在、dashclock は Service を拡張する DashClockExntension を拡張しています。私の疑問は、アプリのメインクラスからデータを要求するためにこのサービスをどのように作成すればよいかということです。startService() でインテントを使用している場合、ウィジェットで null 値を取得しています。ウィジェットが表示する直前にそのデータを取得する方法。

package com.thePaze.Ambiance;

import android.content.Intent;
import com.google.android.apps.dashclock.api.DashClockExtension;
import com.google.android.apps.dashclock.api.ExtensionData;

public class DashMain extends DashClockExtension {

    String temp, humidity;

    @Override
    protected void onUpdateData(int reason) {
        // TODO Auto-generated method stub



        publishUpdate(new ExtensionData().visible(true).status("Ambient").icon(R.drawable.ic_launcher).expandedTitle("Temp & Humidity").expandedBody("Temperature: " + temp+ "\nHumidity: " +humidity)
                .clickIntent(new Intent(DashMain.this, SensorMain.class))

        );

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        super.onStartCommand(intent, flags, startId);

        temp = intent.getStringExtra(temp);
        humidity = intent.getStringExtra(humidity); 


        return START_STICKY;

    }

}   
4

1 に答える 1

2

ドキュメントから:

onUpdateData(int) はデフォルトで約 1 時間に 1 回呼び出されますが、拡張機能は setUpdateWhenScreenOn(boolean) や addWatchContentUris(String[])などのメソッドを使用して、より頻繁な更新を要求できます。

そのリンクをクリックすると、 addWatchContentUris(String[]) のこのドキュメントが表示されます

メインの DashClock アプリが (ContentResolver.registerContentObserver を使用して) 指定されたコンテンツ URI を監視し、変更が観察されたときにこの拡張機能の onUpdateData(int) メソッドを呼び出すように要求します。これは通常、 onInitialize(boolean) メソッドで呼び出す必要があります。

コンテンツ プロバイダーに精通していますか? アクティビティ間でデータを共有する方法です。コンテンツ プロバイダーをウォッチするアクティビティは、更新の通知を受け取ります。これは、dashclock の更新頻度を上げる唯一の方法です。


編集:詳細を追加

コンテンツ プロバイダ エントリを androidmanifest.xml に追加します。オーソリティはパッケージ名で始まる必要がありますが、そうする必要はありません。実際には任意の識別子です。

<provider android:authorities="com.mypackage.myapp.myprovider"
    android:name=".MyProviderClassName"
    android:exported="true"/>

ここで、ContentProvider を拡張する MyProviderClassName というクラスを作成します。メソッドを実装する必要さえありません。デフォルト値を返すだけです。

class MyProviderClassName extends ContentProvider {
    @Override
    public boolean onCreate() {
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        return null;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }
}

次に、onInitialize() の拡張クラスで、次を追加します。

addWatchContentUris(new String[] { "content://" + YOUR_AUTHORITY_FROM_MANIFEST }

拡張機能をアクティビティ内から更新する場合は、次のメソッドを呼び出すだけです。

getContentResolver().notifyChange(Uri.parse("content://" + YOUR_AUTHORITY_FROM_MANIFEST), null);
于 2014-01-29T05:51:10.043 に答える