public class UpdateService extends Service {
private Timer timer = new Timer();
private static final long UPDATE_INTERVAL = 60000;
private final IBinder mBinder = new MyBinder();
public static boolean isServiceRunning;
public void onCreate() {
super.onCreate();
pollForUpdates();
}
private void pollForUpdates() {
timer.scheduleAtFixedRate(new TimerTask() {
@SuppressWarnings("rawtypes")
@Override
public void run() {
Log.v("service", "called...");
Thread.setDefaultUncaughtExceptionHandler(onForceCloseError);
try
{
isServiceRunning=true;
DatabaseHelper db = new DatabaseHelper(UpdateService.this);
BaseObject bObj = db.GetObjectFromDB("GlobalObject1");
long id=Thread.currentThread().getId();
String serviceThreadID= String.valueOf(id);
long restaurantID=((GlobalObject) UpdateService.this.getApplication()).getRestuarantID();
RequestProperty rp1 = new RequestProperty("restaurantID", restaurantID);
ArrayList<RequestProperty> properties = new ArrayList<RequestProperty>();
properties.clear();
properties.add(rp1);
ArrayList customerArrList = SoapInvoker.GetListFromService("GetAllCustomersForRestaurant", properties, new Customer(),UpdateService.this);
ArrayList returnArrayList1 = SoapInvoker.GetListFromService("GetAllAirHostessDetails", null,new Airhostess(),UpdateService.this);
/* For Chef Console and Order Detail Update */
long branchID = ((GlobalObject) UpdateService.this.getApplication()).getBranchID();
RequestProperty rp = new RequestProperty("branchID", branchID);
properties.clear();
properties.add(rp);
ArrayList returnArrayList = SoapInvoker.GetListFromService("GetAllActiveOrderDetailsForBranch", properties ,new OrderDetail(),UpdateService.this);
ArrayList retArrayList = SoapInvoker.GetListFromService("GetAllActiveOrdersForBranch", properties ,new Orders(),UpdateService.this);
ArrayList empTablMapList=SoapInvoker.GetListFromService("GetAllEmployeeTable", null, new EmployeeTable(), UpdateService.this);
ArrayList retArrlist1=SoapInvoker.GetListFromService("GetAllTableBookingsForBranch", properties, new TableBooking(), UpdateService.this);
ArrayList billingList=SoapInvoker.GetListFromService("GetAllBillsForBranch", properties, new Billing(), UpdateService.this);
long orderID=0;
if(Long.parseLong(bObj.getClass().getDeclaredField("OrderID").get(bObj).toString()) != 0){
orderID = ((GlobalObject) UpdateService.this.getApplication()).getOrderID();
}
if (orderID > 0)
{
NotConfirmedOrderDetails1(orderID);
}
//Start
Log.v("Service", "Service call ended.");
}
catch(Exception e)
{
Log.e("ServiceError", e.getMessage());
}
}
}, 0, UPDATE_INTERVAL);
Log.i(getClass().getSimpleName(), "Timer started.");
}
private void NotConfirmedOrderDetails1(long orderID) {
try
{
DatabaseHelper db = new DatabaseHelper(UpdateService.this);
db.setOrderDetailsDataToDB(orderID);
}
catch (Exception e) {
CommonMethods.showErrorDialog(e.getMessage(),UpdateService.this);
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (timer != null) {
timer.cancel();
}
Log.i(getClass().getSimpleName(), "Timer stopped.");
}
// We return the binder class upon a call of bindService
//The onBind() method enables you to bind an activity to a service. This in turn enables an activity
//to directly access members and methods inside a service.
@Override
public IBinder onBind(Intent arg0) {
return mBinder;
}
public class MyBinder extends Binder {
UpdateService getService() {
return UpdateService.this;
}
}
public Thread.UncaughtExceptionHandler onForceCloseError= new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread thread, Throwable ex) {
Log.v("Service stopped", "Service stopped after force close error ...");
//
unbindService(mConnection);
boolean ismConnectionNull = mConnection.equals(null);
String connection=String.valueOf(ismConnectionNull);
Log.v("Connection status", connection);
Log.v("Service", "UnbindService Called");
doBindService();
Log.v("Service", "BindService Called");
ex.printStackTrace();
//
Log.v("Service started", "Service started after force close error ...");
} };
private UpdateService s;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
s = ((UpdateService.MyBinder) binder).getService();
/*Toast.makeText(UpdateService.this, "Connected",
Toast.LENGTH_SHORT).show();*/
}
public void onServiceDisconnected(ComponentName className) {
s = null;
Log.v("Update Servicve","Service Disconnected...");
}
};
void doBindService() {
bindService(new Intent(this, UpdateService.class), mConnection,
Context.BIND_AUTO_CREATE);
Log.v("bindService", "bindService called...");
}
}
我在android中有上述服务。有时我得到未捕获的异常,我的服务停止。我的执行线程进入UnCaughtExceptionHandler。我尝试重新启动服务,但它无法正常工作。任何人都可以帮我解决这个问题。
谢谢,NEHA
答案 0 :(得分:1)
如果Service
为Serice
,您可以使用START_STICKY
重新启动killed
。您只需在START_STICKY
onStartCommand(Intent, int, int)
即可
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//your stuff
return Service.START_STICKY;
}
如果您将某些Intent
传递给Service
并获得killed
,则可以退回Intent
,您可以将该标记用作START_REDELIVER_INTENT
答案 1 :(得分:0)
重新启动在运行时终止的任何服务,然后使用 Service.START_STICKY
答案 2 :(得分:0)
在您的服务类中使用此方法
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_STICKY;
}
使它表现得你想要。