Ты прав.Согласно this BroadcastReceiver вашего виджета будет уничтожен системой, если для обработки его метода onReceive потребуется более 10 секунд.
Сверху головы я вижу два решения:
- Отделите логику от презентации и отладьте свою логику в Activity, а затем включите ее в виджет.
- Используйте «старые добрые» журналы.
ИЛИ вымогу попробовать следующую вещь.Я не уверен, как это будет работать, но, возможно, стоит попробовать этот подход.
Используйте свою собственную деятельность в качестве хоста для RemoteViews виджета.Я сделал что-то вроде этого:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:id="@+id/widget_view"
android:layout_width="fill_parent"
android:layout_height="200dp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Inflate widget"
android:onClick="onInflateClick"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Update widget"
android:onClick="onUpdateClick"/>
</LinearLayout>
В этом макете LinearLayout с id = widget_view будет воспроизводить хост виджета.Сам код действия выглядит следующим образом:
package com.example;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RemoteViews;
public class MyActivity extends Activity {
private LinearLayout widgetHolder;
private View widgetView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
widgetHolder = (LinearLayout) findViewById(R.id.widget_view);
}
public void onInflateClick(View v) {
RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget);
views.setImageViewResource(R.id.image, R.drawable.img1);
views.setTextViewText(R.id.text, "Widget created");
widgetView = views.apply(this, null);
widgetHolder.addView(widgetView);
}
public void onUpdateClick(View v) {
onUpdateWidget(0);
}
public void onUpdateWidget(int widgetId) {
RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget);
views.setImageViewResource(R.id.image, R.drawable.img2);
views.setTextViewText(R.id.text, "Widget updated");
// Tell the AppWidgetManager to perform an update on the current app widget
updateWidget(widgetId, views);
}
private void updateWidget(int widgetId, RemoteViews views) {
views.reapply(this, widgetView);
// appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
Поместите логику обновления виджета в метод updateWidget (или просто вызовите соответствующий метод onUpdate для BroadcastReceiver виджета с поддельными параметрами), и вы можете отладить его одним нажатием кнопкина вашу деятельность.
Опять же, я никогда не пробовал это на реальном виджете, я просто придумал идею и попытался написать код для него.Используйте его на свой страх и риск:)
Я поставил свой быстрый и грязный проект на github на тот случай, если вы захотите его попробовать.Это и проект Idea, но его легко импортировать в Eclipse.