Служба Android неожиданно останавливается

Для приложения для Android, которое я делаю, я хочу, чтобы была служба, которая проверяет базу данных на предмет атаки, даже когда приложение не запущено (вроде того, как facebook будет уведомлять о чем-то, даже если оно закрыто), и поэтому я сделал класс ниже, но через минуту после того, как я остановил свое приложение, я получаю сообщение «Приложение неожиданно остановлено», а затем еще раз через несколько минут ... я знаю, что можно продолжать проверку каким-то образом, потому что многие приложения делают это, но что я делаю неправильный? Это то, что у меня есть до сих пор:

    package com.ducknoise.toonfight;

import java.sql.SQLException;

import android.app.NotificationManager;
import android.app.Service;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Build;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder;
import android.widget.Toast;

public class ToonService extends Service{
    public static ToonService toonService;
    public ToonService(){
        toonService = this;
    }
    @Override
    public IBinder onBind(Intent intent) {
        String toonName = intent.getStringExtra("toonName");
        ToonDB task = new ToonDB();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,toonName);
        } else {
            task.execute(toonName);
        }
        return null;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        String toonName = intent.getStringExtra("toonName");
        ToonDB task = new ToonDB();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,toonName);
        } else {
            task.execute(toonName);
        }
        return Service.START_STICKY;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        Toast.makeText(getApplicationContext(), "Disconnected with Server", Toast.LENGTH_LONG).show();
        Database db = new Database();
        db.closeConnection();
        super.onDestroy();
    }

    public class ToonDB extends AsyncTask<String,Void, Void>{

        Toon toon;
        @Override
        protected Void doInBackground(String... params) {
            Database db = new Database();
            db.establishConnection();
            toon = db.getToonFromDB(params[0]);

            return null;

        }
        @Override
        protected void onPostExecute(Void result) {
            ToonCheck task = new ToonCheck();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,toon);
            } else {
                task.execute(toon);
            }
            super.onPostExecute(result);
        }

    }
    public class ToonCheck extends AsyncTask<Toon,Void, Void>{

        boolean runCheck;
        Toon toon;
        @Override
        protected Void doInBackground(Toon... params) {
            runCheck = true;
            Database db = new Database();
            db.establishConnection();
            toon = params[0];
            toon.updateCheckDB();
            publishProgress();
            if(!db.isOnline(toon))
                runCheck = false;

            return null;

        }
        @Override
        protected void onProgressUpdate(Void... values) {
            Battle battle = toon.getBattle();
            if(battle != null ){
                if(battle.notified()){
                    NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(getApplicationContext());
                    nBuilder.setContentTitle("Toon Fight");
                    String contentText = battle.getOppName() + " has attacked you!";
                    nBuilder.setContentText(contentText);
                    nBuilder.setSmallIcon(R.drawable.ic_launcher);
                    int notiID = 1295;
                    NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
                    notificationManager.notify(notiID, nBuilder.build());
                }
            }
            super.onProgressUpdate(values);
        }
        @Override
        protected void onPostExecute(Void result) {
            if(runCheck){
                ToonCheck task = new ToonCheck();
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,toon);
                } else {
                    task.execute(toon);
                }
            }else 
                stopSelf();
            super.onPostExecute(result);
        }

    }
}

это логкэт

03-24 11:01:41.968: D/AndroidRuntime(4624): Shutting down VM
03-24 11:01:41.968: W/dalvikvm(4624): threadid=1: thread exiting with uncaught exception (group=0x41f5aac8)
03-24 11:01:41.968: E/AndroidRuntime(4624): FATAL EXCEPTION: main
03-24 11:01:41.968: E/AndroidRuntime(4624): java.lang.RuntimeException: Unable to start service com.ducknoise.toonfight.ToonService@430a3950 with null: java.lang.NullPointerException
03-24 11:01:41.968: E/AndroidRuntime(4624):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2782)
03-24 11:01:41.968: E/AndroidRuntime(4624):     at android.app.ActivityThread.access$2000(ActivityThread.java:152)
03-24 11:01:41.968: E/AndroidRuntime(4624):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1385)
03-24 11:01:41.968: E/AndroidRuntime(4624):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-24 11:01:41.968: E/AndroidRuntime(4624):     at android.os.Looper.loop(Looper.java:137)
03-24 11:01:41.968: E/AndroidRuntime(4624):     at android.app.ActivityThread.main(ActivityThread.java:5329)
03-24 11:01:41.968: E/AndroidRuntime(4624):     at java.lang.reflect.Method.invokeNative(Native Method)
03-24 11:01:41.968: E/AndroidRuntime(4624):     at java.lang.reflect.Method.invoke(Method.java:511)
03-24 11:01:41.968: E/AndroidRuntime(4624):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
03-24 11:01:41.968: E/AndroidRuntime(4624):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
03-24 11:01:41.968: E/AndroidRuntime(4624):     at dalvik.system.NativeStart.main(Native Method)
03-24 11:01:41.968: E/AndroidRuntime(4624): Caused by: java.lang.NullPointerException
03-24 11:01:41.968: E/AndroidRuntime(4624):     at com.ducknoise.toonfight.ToonService.onStartCommand(ToonService.java:34)
03-24 11:01:41.968: E/AndroidRuntime(4624):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2765)
03-24 11:01:41.968: E/AndroidRuntime(4624):     ... 10 more

Вот как я вызываю службу:

Intent toonService = new Intent(MainActivity.this, ToonService.class);
                toonService.putExtra("toonName", toon.getName());
                MainActivity.this.startService(toonService);

person user3293629    schedule 24.03.2014    source источник
comment
и ваш логарифм...   -  person nikis    schedule 24.03.2014
comment
я просто выложил это хаха   -  person user3293629    schedule 24.03.2014
comment
У вас есть исключение нулевого указателя в вашем методе onStartCommand.   -  person Kon    schedule 24.03.2014
comment
я только что опубликовал, как я вызываю службу, почему она должна быть нулевой / как я могу сделать ее не нулевой?   -  person user3293629    schedule 24.03.2014


Ответы (1)


Вы должны проверить, является ли ваш intent в onStartCommand null или нет в соответствии с вашим logcat:

03-24 11:01:41.968: E/AndroidRuntime(4624): Caused by: java.lang.NullPointerException
03-24 11:01:41.968: E/AndroidRuntime(4624): at
com.ducknoise.toonfight.ToonService.onStartCommand(ToonService.java:34)

И, пожалуйста, покажите, как вы начинаете Service

person nikis    schedule 24.03.2014
comment
я только что опубликовал, как я вызываю службу, почему она должна быть нулевой / как я могу сделать ее не нулевой? - person user3293629; 24.03.2014
comment
@user3293629 user3293629 это функция флага START_STICKY после уничтожения процесса. Вместо этого попробуйте использовать START_REDELIVER_INTENT, посмотрите здесь developer.android.com/reference/ android/app/Service.html - person nikis; 24.03.2014
comment
но не приведет ли STAR_REDILIVER_INTENT к закрытию службы системой? Я хочу закрыть его сам - person user3293629; 24.03.2014
comment
@user3293629 user3293629 нет, этот флаг можно использовать - person nikis; 24.03.2014