0

Прежде чем я начну, хочу пояснить, что я прочитал предыдущие ответы на похожие темы (в основном this one), и ответ, данный даже в комментариях, не был работа для меня (добавление намерения! = null до намерения.getAction() не работает).Android: Не удалось запустить службу с помощью null: java.lang.NullPointerException

Я пытаюсь сделать предварительный сервис для гороскопа майя. Целью этой услуги является чтение символов гороскопа и предсказание из базы данных SQLite и всякий раз, когда он получает текстовое сообщение со следующим: «MAYA dd/MM/yyyy» (DOB), служба получит информацию и отправит текстовое сообщение автоматически. Я получил это для работы в качестве фоновой службы без ошибок, но я хочу дать ему уведомление, чтобы пользователь мог видеть, работает ли служба или нет.

Я пошел за другими учебниками (tutorial 1 и tutorial 2), чтобы сделать службу переднего плана, и он отлично работает без ошибок.

Моя проблема в том, что всякий раз, когда я запускаю службу, останавливаю службу и, наконец, очищаю плунжер (убивая приложение), я все время получаю исключение Nullpointer на линии 57 моей службы (независимо от того, какой код у меня есть всегда строка 57). На моем телефоне он дает мне сообщение «К сожалению, HoroscopoMaya перестала работать». ДВАЖДЫ!

manifest.xml

<?xml version="1.0" encoding="utf-8"?> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity" 
     android:launchMode="singleTask"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <service android:name=".ServicioAstralMaya" 
      android:exported="false" /> 
</application> 
<uses-permission android:name="android.permission.SEND_SMS" /> 
<uses-permission android:name="android.permission.READ_SMS" /> 
<uses-permission android:name="android.permission.RECEIVE_SMS" /> 

MainActivity.java:

public void startService(View view) 
{ 
    if(bRunning == false) 
    { 
     Intent intent = new Intent(MainActivity.this, ServicioAstralMaya.class); 
     intent.setAction(Constants.ACTION.START_FOREGROUND_ACTION); 
     startService(intent); 
     txtVStatServ.setText("INVOCADOS "); 
     bRunning = true; 
    } 
}//END startService(View) 

public void stopService(View view) 
{ 
    if(bRunning == true) 
    { 
     Intent intent = new Intent(MainActivity.this, ServicioAstralMaya.class); 
     intent.setAction(Constants.ACTION.STOP_FOREGROUND_ACTION); 
     startService(intent); 
     txtVStatServ.setText("DESCANSANDO "); 
     bRunning = false; 
    } 
}//END stopService(View) 

ServicioAstralMaya.java (услуги):

@Override 
public int onStartCommand(Intent intent, int flags, int startID) 
{ 
    if(intent != null && intent.getAction().equals(Constants.ACTION.START_FOREGROUND_ACTION 
    )) 
    { 
     Log.i(TAG, "Servicio iniciado!"); 
     isRunning = true; 
     startForeground(Constants.NOTIFICATION_ID.SERVICE_ID, getCompatNotification()); 
    }else if(intent != null && intent.getAction().equals(Constants.ACTION.STOP_FOREGROUND_ACTION)) 
    { 

     Log.i(TAG, "Servicio detenido!"); 
     isRunning = false; 
     stopForeground(true); 
     stopSelf(); 
    } 
    return START_STICKY; 
} 

private Notification getCompatNotification() 
{ 
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 
    builder.setSmallIcon(R.drawable.homonculus_32) 
     .setContentTitle("Horoscopos Maya") 
     .setTicker("Astros Conectados") 
     .setWhen(System.currentTimeMillis()); 
    Intent startIntent = new Intent(this, MainActivity.class); 
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, startIntent, 
     0); 
    builder.setContentIntent(contentIntent); 
    Notification notification = builder.build(); 

    return notification; 
}//END Notification getCompatNotification() 

@Override 
public void onDestroy() 
{ 
    super.onDestroy(); 
    isRunning = false; 
} 

Constants.java

public interface ACTION 
{ 
    public static final String START_FOREGROUND_ACTION = "edu.ito.jmhg" + 
     ".horoscopomaya.action.START_FOREGROUND"; 
    public static final String STOP_FOREGROUND_ACTION = "edu.ito.jmhg" + 
     ".horoscopomaya.action.STOP_FOREGROUND"; 
} 

public interface NOTIFICATION_ID 
{ 
    public static final int SERVICE_ID = 1; 
} 

Line 57 это: Log.i(TAG, "Servicio iniciado!");

isRunning и bRunning, чтобы проверить, если служба работает так, чтобы показать статус в MainActivity:

bRunning = isServiceRunning(ServicioAstralMaya.class); 

private boolean isServiceRunning(Class<?> serviceClass) 
{ 
    ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 
    for(ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer 
     .MAX_VALUE)) 
    { 
     if(serviceClass.getName().equals(service.service.getClassName())) { 
      return true; 
     } 
    } 
    return false; 
}//END boolean isServiceRunning(Class<?>) 

и с обслуживанием: public static boolean isRunning;

Я даже попытался позвонить в stopService и сделать stopForeground(true); и stopSelf(); в методе onDestroy(), но все же безрезультатно. И ошибка STILL строка 57 моего класса обслуживания.

Logcat:

FATAL EXCEPTION: main 
Process: edu.ito.jmhg.horoscopomaya, PID: 21642 
java.lang.RuntimeException: Unable to start service [email protected] with null: java.lang.NullPointerException 
... 
Caused by: java.lang.NullPointerException at edu.ito.jmhg.horoscopomaya.ServicioAstralMaya.onStartCommand(ServicioAstralMaya.java:57) 

Я бегу Android KitKat 4.4.4 (API 19) с Android Studio 2 с помощью корневое Samsung Гранд Прайм.

EDIT

Я не знаю, если это несколько уместно, но я заметил что-то о Android Studio. Независимо от того, какие изменения я делаю, когда я запустить приложение я получаю уведомление, что «Нет изменений для развертывания»

Журнал событий:

19:32:47 Executing tasks: [:app:assembleDebug] 
19:33:50 Gradle build finished in 1m 3s 59ms 
19:33:51 No changes to deploy 

Я изменил код моей службы и ошибки строки еще 57, который в настоящее время )) сразу после if(intent.getAction().equals(Constants.ACTION.START_FOREGROUND_ACTION

ServicioAstralMaya.java (услуги):

@Override 
public int onStartCommand(Intent intent, int flags, int startID) 
{ 
    if(intent != null && intent.getAction() != null) 
    { 
     if(intent.getAction().equals(Constants.ACTION.START_FOREGROUND_ACTION 
     )) 
     { 
      Log.i(TAG, "Servicio iniciado!"); 
      isRunning = true; 
      startForeground(Constants.NOTIFICATION_ID.SERVICE_ID, getCompatNotification()); 
     }else if(intent.getAction().equals(Constants.ACTION.STOP_FOREGROUND_ACTION)) 
     { 
      Log.i(TAG, "Servicio detenido!"); 
      isRunning = false; 
      stopForeground(true); 
      stopSelf(); 
     } 
    } 
    return START_STICKY; 
} 

Кроме того, с осле я изменил на Android 2 мой Gradle обновляется, и я имел эту странную ошибку, когда я должен был изменить buildToolsVersion в build.gradle от buildToolsVersion "24.0 rc2" к buildToolsVersion "23.0.2"

build.gradle:

apply plugin: 'com.android.application' 
android { 
compileSdkVersion 23 
buildToolsVersion "23.0.2" 

defaultConfig { 
    applicationId "edu.ito.jmhg.horoscopomaya" 
    minSdkVersion 19 
    targetSdkVersion 23 
    versionCode 1 
    versionName "1.0" 
} 
buildTypes { 
    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
} 
} 
dependencies { 
compile fileTree(dir: 'libs', include: ['*.jar']) 
testCompile 'junit:junit:4.12' 
compile 'com.android.support:appcompat-v7:23.1.1' 
} 
+1

Единственное, что я вижу, может быть null, это возврат getAction(). Проверьте, что против null. – Francesc

+0

Я просто попробовал это и все еще ничего ... – jmhg92

+0

Что такое линия 57 в вашем сервисе? – Francesc

ответ

1

Проблема была Android Studio сама!

Как я уже говорил в редактировании, Android студия не дала мне «Нет изменений для развертывания», что было очень странно, так что я искал о нем и нашли this solution

Просто зайдите в «Файл -> Настройки -> Build, Execution, Deployement -> Instant Run "и просто отключите его. С этим Android Studio строит от царапины каждый раз, но это лучше, чем не строить его правильно.

Я сохранил условие if, упомянутое @Francesc, только для того, чтобы быть в безопасности, и мое приложение больше не дает мне NullPointerException.

0

jmhg92 решение было решить мои NullPointerExceptions с помощью служб, модели и фрагментах, когда мгновенный запуск был активным

Просто зайдите в "Файл -> Настройки -> Build, Execution, Deployement -> Instant Run"

Однако, если вы хотите сохранить Instant Run вы можете просто снимите флажок «Restart активность на изменения кода»

Preferences> Сборка, выполнение , Развертывание> Мгновенный запуск> Снимите флажок «Перезапустить активность при изменениях кода»

До сих пор я мог использовать Instant Run и не получил никаких Исключений.

Надеюсь, что это решение полезно кому-то.