0

我正在尝试为我的应用程序制作一个 dashclock 扩展。基本上我的应用程序的主要活动从传感器读取数据并显示它。现在,dashclock 扩展了 DashClockExntension,后者扩展了 Service。我的疑问是,我应该如何让这项服务从应用程序的主类中询问数据。如果我使用带有 startService() 的意图,那么我在小部件中得到空值。如何在小部件显示之前获取该数据。

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) 大约每小时调用一次,但扩展可以使用 setUpdateWhenScreenOn(boolean) 和 addWatchContentUris(String[])等方法来请求更频繁的更新。

如果单击该链接,您将看到 addWatchContentUris(String[]) 的此文档

请求主 DashClock 应用程序监视给定的内容 URI(使用 ContentResolver.registerContentObserver)并在观察到更改时调用此扩展的 onUpdateData(int) 方法。这通常应该在 onInitialize(boolean) 方法中调用。

您熟悉内容提供商吗?它是一种在活动之间共享数据的方法。观看内容提供者的活动会收到更新通知。这是我知道的增加仪表板更新频率的唯一方法。


编辑:添加更多细节

将内容提供程序条目添加到您的 androidmanifest.xml。请注意,权限应该以您的包名称开头,但不是必须的,它实际上只是一个任意标识符。

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

现在创建一个名为 MyProviderClassName 的类来扩展 ContentProvider。您甚至不需要实现任何方法,只需返回默认值即可。

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 回答