微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android小部件在一段时间后停止工作?

我有一个带小部件的手电筒应用程序.小部件用于打开和关闭手电筒,不显示主要活动或任何内容.然而,几个小时后,小部件什么都不做.我的意思是如果你点击它,没有任何反应.
我有两个类来完成提供者和接收者.

提供者:

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,receiver,0);

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

    appWidgetManager.updateAppWidget(appWidgetIds,views);

  }
}

接收器:

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();
        }
      }
    }
  }
}

建立:

<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分钟.

解决方法

请看这篇文章,我认为这个问题在这里解释了 the dark side of app widgets

原文地址:https://www.jb51.cc/android/309738.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐