Android部件停止了一段时间的工作? [英] Android widget stops working after a while?
问题描述
我有一个小窗口手电筒的应用程序。窗口小部件用于开启手电筒和关闭,并且不显示主活动或任何东西。几个小时后,但是,小窗口什么也不做。我的意思是,如果你点击它,什么都不会发生。
我有两个类即可完成此一提供
和接收
。
提供者:
公共类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:机器人=http://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屋!