【问题标题】:Android widget stops working after a while?Android小部件在一段时间后停止工作?
【发布时间】:2015-05-12 01:00:57
【问题描述】:

我有一个带有小部件的手电筒应用程序。该小部件用于打开和关闭手电筒,不显示主要活动或任何内容。然而,几个小时后,小部件什么也不做。我的意思是如果你点击它,什么都不会发生。 我有两个 来完成此任务,一个 Provider 和一个 Receiver

Provider:

public class WidgetProvider extends AppWidgetProvider {

  @
  Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager,
    int[] appWidgetIds) {

    Intent receiver = new Intent(context, FlashlightWidgetReceiver.class);
    receiver.setAction("COM_FLASHLIGHT");
    receiver.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, receiver, 0);

    RemoteViews views = new RemoteViews(context.getPackageName(),
      R.layout.appwidget_layout);
    views.setOnClickPendingIntent(R.id.imageButton, pendingIntent);

    appWidgetManager.updateAppWidget(appWidgetIds, views);

  }
}

Receiver:

public class FlashlightWidgetReceiver extends BroadcastReceiver {
  private static boolean isLightOn = false;
  private static Camera camera;
  MediaPlayer mp;@
  Override
  public void onReceive(Context context, Intent intent) {
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_layout);

    if (isLightOn) {
      views.setImageViewResource(R.id.imageButton, R.drawable.btn_switch_off);
      mp = MediaPlayer.create(context, R.raw.light_switch_off);
    } else {
      views.setImageViewResource(R.id.imageButton, R.drawable.btn_switch_on);
      mp = MediaPlayer.create(context, R.raw.light_switch_on);
    }
    mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

      @
      Override
      public void onCompletion(MediaPlayer mp) {
        // TODO Auto-generated method stub
        mp.release();
      }
    });
    mp.start();
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    appWidgetManager.updateAppWidget(new ComponentName(context, WidgetProvider.class),
      views);

    if (isLightOn) {
      if (camera != null) {
        camera.stopPreview();
        camera.release();
        camera = null;
        isLightOn = false;
      }

    } else {
      camera = Camera.open();

      if (camera == null) {
        Toast.makeText(context, "No Camera!", Toast.LENGTH_SHORT).show();
      } else {
        Camera.Parameters param = camera.getParameters();
        param.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        try {
          camera.setParameters(param);
          camera.startPreview();
          isLightOn = true;
        } catch (Exception e) {
          Toast.makeText(context, "No Flash!", Toast.LENGTH_SHORT).show();
        }
      }
    }
  }
}

Setup:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:maxWidth="40dp"
    android:maxHeight="40dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/appwidget_layout"
    android:resizeMode="horizontal|vertical">
</appwidget-provider>

更新:减少更新间隔会使小部件更频繁地刷新,因此如果它被卡住,它会在 30 分钟后再次工作,然后它可能会在某个时候再次冻结。

更新 2:更改日期会立即冻结小部件,直到它被刷新。

更新 3:更改日期会以某种方式重新启动启动器,并且每当启动器重新启动时,小部件都会冻结 30 分钟。

【问题讨论】:

标签: android widget broadcastreceiver appwidgetprovider


【解决方案1】:

找这个帖子,我觉得这个问题在这里解释the dark side of app widgets

【讨论】:

  • 谢谢,但是帖子谈到了一些操作系统错误,我们遇到的大多数冻结来自应用程序本身并且是可以避免的。
【解决方案2】:

好吧,伙计们,我终于有时间一劳永逸地解决这个问题了:)

我为提供者创建了更多方法,而不是在 onUpdate 中做所有事情,需要一个重要的方法:

    public static PendingIntent buildButtonPendingIntent(Context context) {
      Intent intent = new Intent();
      intent.setAction("COM_FLASHLIGHT");
      return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }

当小部件被点击时,这个方法会通过接收器调用,代码如下:

private void turnFlash(Context context) {
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_layout);
    views.setOnClickPendingIntent(R.id.imageButton,       WidgetProvider.buildButtonPendingIntent(context));
}

就是这样,不要再打嗝了!

【讨论】:

  • 刷新小部件的监听器。
  • 嗨 Mohamed,我知道这个帖子已经 2 年了,但是如果你能提供我更改后的代码,或者至少告诉我你在哪里调用 turnFlash ?我会非常感激。我正在尝试构建应用小部件,但我仍然不完全了解它是如何工作的,所以我希望你能帮助我
  • @MuhammadAli 我看到了您在这篇文章中报告的相同问题。你能帮我解决一下吗,你是怎么解决的。我已经在使用您在接受的答案中使用的相同方法。你有没有做其他事情来解决它?
  • @Jim 你是眼睛还是按钮?解决方案就在那里。它对我有用,显然如果我是这方面的专家并且可以解释我不会发布问题的所有内容。吹嘘什么?我很高兴找到了解决方案,哈哈?
猜你喜欢
  • 2014-11-15
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
相关资源
最近更新 更多