你是对的。根据this,如果处理其 onReceive 方法的时间超过 10 秒,您的 Widget 的 BroadcastReceiver 将被系统杀死。
从我的脑海中,我可以看到两个解决方案:
- 将逻辑与表示分离并在 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>
在此布局中,ID = widget_view 的 LinearLayout 将播放小部件主机。活动代码本身如下所示:
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 方法中(或使用假参数调用小部件的 BroadcastReceiver 的正确 onUpdate 方法),您可以通过单击 Activity 上的按钮对其进行调试。
再一次,我从未在真正的小部件上尝试过,我只是想出了一个想法并尝试为它编写代码。使用它需要您自担风险:)
我将我的快速而肮脏的项目提交给github,以防你想尝试。是和Idea项目,不过导入Eclipse应该很容易。