Android部件停止了一段时间的工作? [英] Android widget stops working after a while?

查看:249
本文介绍了Android部件停止了一段时间的工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个小窗口手电筒的应用程序。窗口小部件用于开启手电筒和关闭,并且不显示主活动或任何东西。几个小时后,但是,小窗口什么也不做。我的意思是,如果你点击它,什么都不会发生。 我有两个即可完成此一提供接收

提供者:

公共类WidgetProvider扩展AppWidgetProvider {   @   覆盖   公共无效的OnUpdate(上下文的背景下,AppWidgetManager appWidgetManager,     INT [] appWidgetIds){     意图接收器=新的意图(背景下,FlashlightWidgetReceiver.class);     receiver.setAction(COM_FLASHLIGHT);     receiver.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,appWidgetIds);     PendingIntent pendingIntent = PendingIntent.getBroadcast(上下文,0,接收机,0);     RemoteViews意见=新RemoteViews(context.getPackageName()       R.layout.appwidget_layout);     views.setOnClickPendingIntent(R.id.imageButton,pendingIntent);     appWidgetManager.updateAppWidget(appWidgetIds,意见);   } }

接收器:

公共类FlashlightWidgetReceiver扩展的BroadcastReceiver {   私有静态布尔isLightOn = FALSE;   私有静态摄像头摄像头;   MediaPlayer的熔点; @   覆盖   公共无效的onReceive(上下文的背景下,意图意图){     RemoteViews意见=新RemoteViews(context.getPackageName(),R.layout.appwidget_layout);     如果(isLightOn){       views.setImageViewResource(R.id.imageButton,R.drawable.btn_switch_off);       MP = MediaPlayer.create(背景下,R.raw.light_switch_off);     } 其他 {       views.setImageViewResource(R.id.imageButton,R.drawable.btn_switch_on);       MP = MediaPlayer.create(背景下,R.raw.light_switch_on);     }     mp.setOnCompletionListener(新MediaPlayer.OnCompletionListener(){       @       覆盖       公共无效onCompletion(MediaPlayer的MP){         // TODO自动生成方法存根         mp.release();       }     });     mp.start();     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(上下文);     appWidgetManager.updateAppWidget(新的组件名(背景下,WidgetProvider.class)       意见);     如果(isLightOn){       如果(相机!= NULL){         camera.stop preVIEW();         camera.release();         摄像头= NULL;         isLightOn = FALSE;       }     } 其他 {       相机= Camera.open();       如果(相机== NULL){         Toast.makeText(背景下,Toast.LENGTH_SHORT无摄像头!).show();       } 其他 {         Camera.Parameters参数= camera.getParameters();         param.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);         尝试 {           camera.setParameters(参数);           camera.start preVIEW();           isLightOn = TRUE;         }赶上(例外五){           Toast.makeText(背景下,不闪!,Toast.LENGTH_SHORT).show();         }       }     }   } }

设置:

< appwidget提供商的xmlns:机器人=htt​​p://schemas.android .COM / APK / RES /安卓     机器人:=了minWidth40dp     机器人:=了minHeight40dp     机器人:=了maxWidth40dp     机器人:=了maxHeight40dp     机器人:updatePeriodMillis =86400000     机器人:initialLayout =@布局/ appwidget_layout     机器人:resizeMode =横|纵> < / appwidget提供者>

更新:减少更新间隔,使部件更新更频繁,所以如果它坚持它的工作原理又30分钟后,然后它可能会再次冻结的某个时候。

更新2:更改日期瞬间冻结的部件,直到它的刷新

更新3:更改日期某种方式重新启动启动,每当发射重新启动小部件冻结30分钟

解决方案

好的球员,我终于有时间来解决这个问题一劳永逸:)

我创造了更多的方式为供应商而不是做一切的onupdate,其中一个重要方法,需要的:

公共静态PendingIntent buildButtonPendingIntent(上下文的背景下){       意向意图=新的意图();       intent.setAction(COM_FLASHLIGHT);       返回PendingIntent.getBroadcast(背景下,0,意向,PendingIntent.FLAG_UPDATE_CURRENT);     }

和该方法通过接收器时调用插件使用以下code点:

私人无效turnFlash(上下文的背景下){     RemoteViews意见=新RemoteViews(context.getPackageName(),R.layout.appwidget_layout);     views.setOnClickPendingIntent(R.id.imageButton,WidgetProvider.buildButtonPendingIntent(上下文)); }

这是一切,没有更多的打嗝!

I have a flashlight app with a widget. The widget is used to turn the flashlight on and off and does not display main activity or anything. After a few hours, however, the widget does nothing. I mean if you click it, nothing happens. I have two classes to accomplish this a Provider and a 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>

Update: Reducing the update interval makes the widget refresh more often so if it's stuck it works again after 30 min and then it might freeze again sometime.

Update 2: Changing the date instantly freezes the widget until it's refreshed.

Update 3: Changing the date somehow restarts the launcher and whenever the launcher is restarted the widget freezes for 30 mins.

解决方案

Alright guys, I finally got time to fix this problem once and for all :)

I created more methods for the provider instead of doing everything in onUpdate, one important method needed:

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

And this method is called through the receiver when the widget is clicked using the code below:

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

That is all, no more hiccups!

这篇关于Android部件停止了一段时间的工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆