Как перезапустить сервис в андроиде, как только он остановится после необработанного исключения? - PullRequest
1 голос
/ 17 февраля 2012
    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. Там я пытаюсь перезапустить службу, но она не работает. Кто-нибудь, пожалуйста, помогите мне в этом вопросе.

Спасибо, Нех

Ответы [ 3 ]

1 голос
/ 17 февраля 2012

Вы можете использовать START_STICKY для перезапуска Service, если ваш Serice равен 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

0 голосов
/ 17 февраля 2012

используйте этот метод в своем классе обслуживания
@Override<br> public int onStartCommand(Intent intent, int flags, int startId) {<br> return Service.START_STICKY;<br> }


, чтобы заставить его вести себя так, как вам нужно.

0 голосов
/ 17 февраля 2012

для перезапуска любой службы, которая прекращается во время выполнения, затем используйте Service.START_STICKY

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...