Как периодически получать данные о деятельности?

Я пытаюсь сделать расширение dashclock для моего приложения. В основном, основная деятельность моего приложения читает данные с датчика и показывает их. Теперь dashclock расширяет DashClockExntension, который расширяет Сервис. Я сомневаюсь, как я должен сделать этот сервис, чтобы запрашивать данные из основного класса приложения. Если я использую намерение с 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;

    }

}   

1 ответ

Из документации:

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);
Другие вопросы по тегам