【问题标题】:My android widget crashes launcher. How do I debug that?我的 android 小部件崩溃启动器。我该如何调试?
【发布时间】:2013-11-25 11:19:50
【问题描述】:

我开发了一个简单的小部件,它有两个按钮来打开和关闭我的双卡手机 SIM 卡。我在我的 AppWidgetProvider 实现的 onUpdate 方法中连接按钮单击。不幸的是,在几次成功点击后,启动器重新加载(我观察到我的设备屏幕上短暂闪烁)并且我的小部件在按钮点击时不再执行任何操作。

我尝试查看我的 LogCat,但没有发现任何有趣的启动器应用程序。

现在的问题是如何调试这种情况?

编辑: 这是我的 AppWidgetProvider 的一些代码。我知道代码很幼稚,需要进行一些重构,但我仍然需要以某种方式调试启动器崩溃:

    @Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    RemoteViews remoteViews;
    ComponentName widget;

    remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
    widget = new ComponentName(context, ExampleAppWidgetProvider.class);

    int currentState = Settings.System.getInt(context.getContentResolver(), "dual_sim_mode_setting", -1);
    String sim1Text = currentState == 1 || currentState == 3 ? "on" : "off";
    String sim2Text = currentState == 2 || currentState == 3 ? "on" : "off";

    remoteViews.setTextViewText(R.id.first_button, sim1Text);
    remoteViews.setTextViewText(R.id.second_button, sim2Text);

    remoteViews.setOnClickPendingIntent(R.id.first_button, getPendingSelfIntent(context, SIM1_CLICKED));
    remoteViews.setOnClickPendingIntent(R.id.second_button, getPendingSelfIntent(context, SIM2_CLICKED));
    appWidgetManager.updateAppWidget(widget, remoteViews);
}

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    if ("android.appwidget.action.APPWIDGET_UPDATE".equals(intent.getAction()))
    {
        super.onReceive(context, intent);
        return;
    }

    if (SIM1_CLICKED.equals(intent.getAction())) {
        switchSim(1, context);
        return;
    }

    else if (SIM2_CLICKED.equals(intent.getAction())){
        switchSim(2, context);
    }

    else if ("android.intent.action.DUAL_SIM_MODE".equals(intent.getAction())){
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

        RemoteViews remoteViews;
        ComponentName watchWidget;

        remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
        watchWidget = new ComponentName(context, ExampleAppWidgetProvider.class);

        int mode = intent.getIntExtra("mode", -1);
        switch (mode)
            {
                case 0:
                    remoteViews.setTextViewText(R.id.first_button, "off");
                    remoteViews.setTextViewText(R.id.second_button, "off");
                    break;
                case 1:
                    remoteViews.setTextViewText(R.id.first_button, "on");
                    remoteViews.setTextViewText(R.id.second_button, "off");
                    break;
                case 2:
                    remoteViews.setTextViewText(R.id.first_button, "off");
                    remoteViews.setTextViewText(R.id.second_button, "on");
                    break;
                case 3:
                    remoteViews.setTextViewText(R.id.first_button, "on");
                    remoteViews.setTextViewText(R.id.second_button, "on");
                    break;
            }

        appWidgetManager.updateAppWidget(watchWidget, remoteViews);
   }
}

【问题讨论】:

    标签: android debugging crash android-widget android-launcher


    【解决方案1】:

    嗯,因为您没有发布任何代码,我只能猜测,但我假设您实现了 View.OnClickListener。我只需执行以下操作:

    声明一个调试标签:

    final String tag = "#OnClick";
    

    日志信息:

    myButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Log.d(tag, "I've been clicked!") // or even add useful information.
                // code ..
            }
        });
    

    这样你至少可以确定OnClickListener 是否仍然在你的按钮上被调用。

    为了查看消息,您可以像这样向 logCat 添加过滤器:

    至少这是 LogCat 在 Eclipse 中的工作方式,我不确定其他 API,但可能有类似的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-11
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 2013-04-05
      相关资源
      最近更新 更多