如何定期从活动中获取数据?

时间:2013-05-08 21:14:32

标签: android service dashclock

我正在尝试为我的应用制作一个dashclock扩展程序。基本上我的应用程序的主要活动从传感器读取数据并显示它。现在,dashclock扩展了扩展Service的DashClockExntension。我的疑问是,我应该如何使这项服务从应用程序的主类中提问数据。如果我使用startService()的intent,那么我在widget中获取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;

    }

}   

1 个答案:

答案 0 :(得分:2)

From the documentation:

  

onUpdateData(int)默认情况下每小时大致调用一次,但是   扩展可以使用setUpdateWhenScreenOn(boolean)和   addWatchContentUris(String[])请求更频繁的更新。

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

的此文档
  

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

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


编辑:添加更多细节

向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);