Прежде чем я начну, хочу пояснить, что я прочитал предыдущие ответы на похожие темы (в основном 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'
}
Единственное, что я вижу, может быть null, это возврат getAction(). Проверьте, что против null. – Francesc
Я просто попробовал это и все еще ничего ... – jmhg92
Что такое линия 57 в вашем сервисе? – Francesc