当前位置: 首页 > 面试题库 >

“清除内存” + appWidget崩溃后,服务未重新启动

边国安
2023-03-14
问题内容

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

问题是,在我使用内置的任务管理器的“清除内存/内存”之后,appWidget视图崩溃(所有appWidgets
TextView的文本均设置为默认值(TextView)),并且服务停止运行并且永远不会重启。

仅在设置了小部件一段时间后才会发生这种情况,如果在设置小部件后立即清理内存/内存,则不会发生错误,但是我想这与任务管理器的清理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,用于监听包的更改和更新:

在清单文件中注册接收者:

<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-在大多数内存清洁器正在清洁内存时调用。
  • “数据”行用于监视应用于特定程序包的操作。

在此接收器中,我再次启动服务,然后重新启动小部件视图(在本例中为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)中的静态方法,用于注册所需的服务。

希望它也会对您有帮助=]



 类似资料:
  • 问题内容: 关于它有几个问题,但我总是读同一本书:“如果系统需要资源,该服务将被杀死”或“您无法构建永远运行的服务,因为它在后台运行的次数越多,越容易受到影响。被系统杀死”等等。 我面临的问题是:我的服务运行正常,并且可以预期,如果我运行我的应用程序,然后退出它,我的服务仍在运行,但是当我杀死我的应用程序时(通过转到“最近的应用程序”并对其进行扫描)离开)服务停止。在这一刻,如果我转到设置>>应用

  • 我们在Android8.1及以上版本中偶然发现了一个我们以前从未见过的问题,不幸的是,这使得我们的应用程序对我们的用户来说不太方便。在Android 8.1及以上版本中,当用户刷屏杀死应用程序时,后台粘性服务不会重新启动。

  • 问题内容: 有什么方法可以在不重启mySQL服务器的情况下 清除 mysql 查询缓存 ? 问题答案: 我相信您可以使用… …如果您所运行的用户具有重新加载权限。另外,您可以通过…对查询缓存进行碎片整理。 有关更多信息,请参见MySQL手册的“ 查询缓存状态和维护”部分。

  • 我正在尝试制作一个粘性服务,该服务在死亡后不久就会重新启动(例如,因为Android已经杀死了它以释放内存)。(Un)幸运的是,我在Android 5.0.1上,它有一个漂亮的内存泄漏错误,使真正的测试变得容易。 看着我看到: 后来时间上升到3M,使其不可接受。 我试图使用AlarmManager和重新启动意图来解决这个问题: 然而,这没有帮助。我在日志中找不到任何信息,所以可能是AlarmMan

  • 严重:初始化连接器[connector[HTTP/1.1-8080]]org.apache.catalina.LifecyCleException失败:尝试为组件[connector[HTTP/1.1-8080]]进行无效的生命周期转换([before_init]),该组件处于状态[INITIALIZED],位于org.apache.catalina.util.LifecyCleBase.inva

  • 我正在试图找到一个解决方案,解决重新加载后在中崩溃的问题。情况: 树形结构 现在我必须添加。为此,我得到了,并使用方法I添加。 在这之后,我调用树的DefaultTreeModel上的方法。 问题是,在这个调用之后,树将全部崩溃: 而且我必须手动展开节点以确保节点被添加... 我的密码。。。 当我添加节点时。。。 问题在于节点的位置。和节点没有层次结构。 有没有办法避免这种行为?谢谢 也许另一种方