java - "Clear Memory"+ appWidget 崩溃后服务不重启

标签 java android service widget

我构建了一个 appWidget,它在他的 onEnabled() 方法上注册了一些服务。

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

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

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

很高兴有想法和解决方案!感谢高级,Gal :)

我使用的一些代码:

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

最佳答案

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

刚刚添加了 BroadcastReciever 来监听包的变化和更新:

在 list 文件中注册接收器:

<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 - 当大多数内存清理器清理内存时调用。
  • “数据”行用于监控对特定包应用的操作。

在这个接收器中,我再次启动我的服务,并重新启动小部件 View (在这种情况下调用它的 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(Context) 是我的 AppWidgetProvider 类 (MyWidget_1x1/MyWidget_2x2) 中的一个静态方法,用于注册所需的服务。

希望对你也有帮助 =]

关于java - "Clear Memory"+ appWidget 崩溃后服务不重启,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7862882/

相关文章:

java - 用查询替换 Temp

android - Android 服务中的数据包监听器

c# - 使用 C# 启动服务

android - 如何部署我的 Android 项目以及如何在我的设备上进行测试

java - Android 将正在进行的通话置于最前面?

android - 在 RecyclerView 中未正确解析暗模式颜色

javascript - 从同一服务但在 $watchcollection 中调用 AngularJS 服务中的函数

java - 如何对返回 void 的方法运行 junit 测试?

java - 负小数的幂升为小数

java - 如果实体名称保存在变量中,如何编写 hibernate 插入查询