Gal*_*e33 4 java service android widget
我已经构建了一个appWidget,它在onEnabled()方法上注册了一些服务.
问题是,在我使用内置任务管理器的Clean Memmory/Ram之后,appWidget视图崩溃(所有appWidgets TextView的文本都设置为默认值(TextView)),服务停止运行,从不重新启动.
这只发生在设置小部件一段时间后,如果我在设置小部件后立即清理Memmory/Ram,则不会发生错误,但我想这与任务管理器清理RAM的方法有关.
最后,我的问题是:有没有办法告诉android系统重新启动这些服务?我通过市场下载的其他应用程序似乎在此过程后继续正常工作.
会很高兴的想法和解决方案!谢谢先进,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);
}
Run Code Online (Sandbox Code Playgroud)
其中一个服务的一些方法(其他服务非常相似,因为这是来自他们的抽象方法):
@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();
}
Run Code Online (Sandbox Code Playgroud)
经过大量的研究和一些尝试,解决了它!:)
刚刚添加了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>
Run Code Online (Sandbox Code Playgroud)
在这个接收器中,我再次启动我的服务,并重新启动widget视图(在这种情况下调用它的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));
}
}
Run Code Online (Sandbox Code Playgroud)
registerServices(Context)是我的AppWidgetProvider类(MyWidget_1x1/MyWidget_2x2)中的静态方法,它注册所需的服务.
希望它也会帮助你=]
| 归档时间: |
|
| 查看次数: |
5966 次 |
| 最近记录: |