1

Ich habe eine Empfängerklasse, um zu überprüfen, ob das Mobiltelefon am Ladegerät angeschlossen oder nicht angeschlossen ist. Ich möchte einen Ton (mit Benachrichtigung) wiedergeben, wenn das Telefon nicht angeschlossen ist.Meine Empfängerklasse schlägt fehl, wenn ich mein Programm aus dem Hintergrund entferne

folgende ist meine Klasse und es funktioniert richtig. Aber wenn ich mein Programm aus dem Fenster "Zuletzt geöffnete Programme starten" schließe, wird nur dieser Teil geschlossen (ich kann immer noch den Toast "CONNECTED" sehen), warum?

MyReceiver.java

public class MyReceiver extends BroadcastReceiver { 
static int num = 0; 
public static SharedPreferences sharedPreferences; 
Notification notification = new Notification(); 
@Override 
public void onReceive(Context context, Intent intent) { 

    String action = intent.getAction(); 

    if(action.equals(Intent.ACTION_POWER_CONNECTED)) { 
     Toast.makeText(context, "CONNECTED", Toast.LENGTH_LONG).show(); 
    } 
    else if(action.equals(Intent.ACTION_POWER_DISCONNECTED)) { 

     Toast.makeText(context, "" + num, Toast.LENGTH_LONG).show(); 

     NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); 
     String strRingtonePreference = sharedPreferences.getString("song", null); 
     Toast.makeText(context, "" +strRingtonePreference, Toast.LENGTH_LONG).show(); 
     notification.sound = Uri.parse(strRingtonePreference); 
     nm.notify(0, notification); 
     num++; 
    } 
} 

und das ist mein mainActivity.java

public class MainActivity extends Activity { 
public String path = ""; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button b = (Button) findViewById(R.id.button); 
    b.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); 
      intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION | RingtoneManager.TYPE_RINGTONE); 
      intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); 
      intent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); 
      path = load(); 
      Toast.makeText(getBaseContext(),"" + (path == null), Toast.LENGTH_SHORT).show(); 
      startActivityForResult(intent, 1); 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (resultCode == RESULT_OK) { 
     Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); 
     if (uri != null) { 
      String ringTonePath = uri.toString(); 
      TextView t = (TextView)findViewById(R.id.textView); 
      t.setText(ringTonePath); 
      save(ringTonePath); 
     } 
    } 
} 

private void save(String ringTonePath) { 

    MyReceiver.sharedPreferences = getPreferences(Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = MyReceiver.sharedPreferences.edit(); 
    editor.putString("song", ringTonePath); 
    editor.putInt("times" , 3); 
    editor.apply(); 
} 
private String load() { 
    MyReceiver.sharedPreferences = getPreferences(Context.MODE_PRIVATE); 
    return MyReceiver.sharedPreferences.getString("song", null); 
} 

}

Manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
 
    package="com.example.n.receiver" > 
 
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/> 
 
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/> 
 
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> 
 
    <application 
 
     android:allowBackup="true" 
 
     android:icon="@mipmap/ic_launcher" 
 
     android:label="@string/app_name" 
 
     android:theme="@style/AppTheme" > 
 
     <activity 
 
      android:name=".MainActivity" 
 
      android:label="@string/app_name" > 
 
      <intent-filter> 
 
       <action android:name="android.intent.action.MAIN" /> 
 
       <category android:name="android.intent.category.LAUNCHER" /> 
 
      </intent-filter> 
 
     </activity> 
 
     <receiver android:name=".MyReceiver"> 
 
      <intent-filter> 
 
       <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> 
 
       <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> 
 
      </intent-filter> 
 
     </receiver> 
 
    </application> 
 
</manifest>

Danke für Ihre Hilfe.

+0

Bitte veröffentlichen Sie Ihr Manifest –

+0

ok. Ich habe meine Frage aktualisiert –

Antwort

0

Wie ich vermutete, haben Sie <intent-filter> an Ihre BroadcastReceiver im Manifest angeschlossen. Das bedeutet, dass Android Ihre BroadcastReceiver instanziiert und onReceive() anruft, auch wenn Ihre App nicht ausgeführt wird. In diesem Fall ist die Variable sharedpreferences in MyReceiver Null, weil sie noch nicht initialisiert ist, und onReceive() löst eine NullPointerException aus.

Wenn Sie nur diese Sendung Intent s erhalten möchten, wenn Ihre Anwendung ausgeführt wird, entfernen Sie die <intent-filter> aus dem Manifest und Ihre BroadcastReceiver in Code registrieren mit registerReceiver() statt.

+0

Vielen Dank. Ja, es ist die einzige Receiver-Klasse, die ich in meiner App brauche. –