Как периодически получать данные о деятельности?
Я пытаюсь сделать расширение 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);