2011-10-22 100 views
3

我已经构建了一个appWidget,它在onEnabled()方法上注册了一些服务。“清除内存”+ appWidget崩溃后服务不会重新启动

问题是,在我使用内置任务管理器的Clean Memmory/Ram后,appWidget视图崩溃(所有appWidgets TextView的文本都设置为默认值(TextView)),服务停止运行并且从不重新启动。

这只会发生在一段时间后的小部件设置,如果我清洁Memmory/Ram的小部件设置后立即错误没有发生,但我想这是有关任务管理器的清理RAM的方法。

最后,我的问题是:有没有办法告诉android系统重新启动这些服务?作为我通过市场下载的其他appWidgets似乎在此过程之后继续正常工作。

会很高兴的想法和解决方案!由于先进的,加:)

一些代码,我使用:

在appWidget的onEnabled()方法:

@Override 
public void onEnabled(Context context) { 
    super.onEnabled(context); 

    Intent newinIntent = new Intent(context, CallService_1x1.class); 
     context.startService(newinIntent); 

    newinIntent = new Intent(context, SmsService_1x1.class); 
     context.startService(newinIntent); 
} 

从服务的一个有些方法(其它服务内容有非常相似这是从他们的抽象方法):

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // We want this service to continue running until it is explicitly 
     // stopped, so return sticky. 
     Log.d("SERVICE-SMS","CallMonitorService - onStartCommand created"); 
     return START_STICKY; 
    } 

@Override 
    public void onCreate() { 
    super.onCreate(); 
    context = this.getApplicationContext(); 
    Log.d("SERVICE-SMS","CallMonitorService created"); 
    registerObserver(); 
    } 

@Override 
    public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
    } 

    @Override 
    public void onDestroy() { 
    unregisterObserver(); 
    super.onDestroy(); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
    return null; 
    } 
    /** 
    * Start the service to process that will run the content observer 
    */ 
    public static void beginStartingService(Context context) { 
    Log.d("SERVICE-SMS","CallMonitorService: beginStartingService()"); 
    context.startService(new Intent(context, CallService.class)); 
    } 

    /** 
    * Called back by the service when it has finished processing notifications, 
    * releasing the wake lock if the service is now stopping. 
    */ 
    public static void finishStartingService(Service service) { 
    Log.d("SERVICE-SMS","CallMonitorService: finishStartingService()"); 
    service.stopSelf(); 
    } 

回答

9

经过大量的研究和一些尝试,解决了它! :)

只需添加BroadcastReciever听包装的变化和更新:

登记接收清单文件:

<receiver android:name=".receivers.onRestartReciever"> 
     <intent-filter> 
      <action android:name="android.intent.action.PACKAGE_REPLACED" /> 
      <action android:name="android.intent.action.PACKAGE_RESTARTED" /> 
      <data android:scheme="package" android:path="my.Package.Path" /> 
     </intent-filter> 
  • PACKAGE_REPLACED - 特别呼吁通知应用程序更新。
  • PACKAGE_RESTARTED - 当大多数存储器清洁工正在清理存储器时调用。
  • “data”行用于监视为特定程序包应用的操作。

在这个rec​​iever我要重新开始我的服务,并重新启动小工具视图(调用它在这种情况下的onUpdate()方法):

public class onRestartReciever extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 
    Log.d("DEBUG", "onRestartReciever"); 

    // Register Services 
    MyWidget_1x1.registerServices(context); 
    MyWidget_2x2.registerServices(context); 

    // reInitialize appWidgets 
    AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(context); 

    MyWidget_1x1 widget1x1=new CallWidgi(); 
    widget1x1.onUpdate 
    (context, 
     AppWidgetManager.getInstance(context), 
      widget1x1.getIDs(context, appWidgetManager)); 

    MyWidget_2x2 widget2x2=new CallWidgi2(); 
    widget2x1.onUpdate(context, 
         AppWidgetManager.getInstance(context), 
          widget2x2.getIDs(context, appWidgetManager)); 
    } 
} 

registerServices(上下文)是我的AppWidgetProvider静态方法类(MyWidget_1x1/MyWidget_2x2),用于注册所需的服务。

希望它也能帮到你=]

+0

不工作,内存清理后Widget冻结... – Monzur

0

感谢您成功研究您自己的解决方案。你指出我正确的方向。我遇到类似的问题,appwidget在重新启动或重新启动后不再更新,也不会响应按钮点击。

我所做的第一次添加如下清单:

<receiver android:name=".BootReceiver"> 
    <intent-filter> 
    <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    </intent-filter> 
</receiver> 

然后,我创建了一个BootReceiver.java文件,类似于下面的东西。在我的情况下,我不得不重新创建按钮的警报和未决意图。

public class BootReceiver extends BroadcastReceiver 
{ 
    /* 
    * after reboot widget appears to stop working and becomes unresponsive to clicks 
    * this broadcast receiver will create new alarm and refresh pending intents 
    */ 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
    /* do your stuff here, mostly just copy&paste from other places */ 
    } 
} 

有些功劳,这也去:Proximity Alerts not working after phone reboot

1

上面的东西确实赶上重启事件,但未能赶上清晰记忆的事件,因为android.intent.action.PACKAGE_RESTARTED不会被发送到包本身。

我通过添加服务解决了这个问题。这个服务获得了一个明确的内存事件调用的onCreate()。请注意,您必须使用从AppWidgetProvider调用的startService调用来启动服务。

Intent i= new Intent(context, CTService.class); 
// potentially add data to the intent 
i.putExtra("KEY1", "Value to be used by the service"); 
ComponentName name = context.startService(i); 

服务代码是这样的:

@Override 
public void onCreate() 
{ 
    Log.d(TAG,"onCreate"); 
    ping(); 
} 
@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.d(TAG,"onStartCommand: "+intent.getAction()); 
    //TODO do something useful 
    ping(); 
    return Service.START_STICKY; 
    } 

ping实际的东西,这使得对小部件的触摸事件的工作。

相关问题