“你是对的。根据
this,如果Widget的BroadcastReceiver在处理其onReceive方法时需要超过10秒钟,系统将会杀掉它。”
“我能想到两个解决方案:”
“1. 将逻辑与展示分开,在Activity中调试逻辑,然后再将其整合到小部件中。”
“2. 使用‘旧好’的日志记录。”
“或者你可以尝试以下方法。我不确定它是否有效,但也许值得一试。”
“使用自己的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将扮演小部件宿主的角色。Activity代码本身看起来像这样:
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");
updateWidget(widgetId, views);
}
private void updateWidget(int widgetId, RemoteViews views) {
views.reapply(this, widgetView);
}
}
将您的小部件更新逻辑放入updateWidget方法中(或仅使用虚假参数调用小部件的BroadcastReceiver的正确onUpdate方法),然后您可以在活动上轻松调试它。
再次强调,我从未在真正的小部件上尝试过它,我只是想出了这个想法并尝试编写了代码。使用它要自担风险 :)
如果您想尝试,我已经将我的快速而粗糙的项目放到
github上。它是一个Idea项目,但应该很容易将其导入Eclipse。