私はよく検索し、いくつかの方法を試しましたが、エラーを回避するものは見つかりませんでした.
私は学習用のアプリに取り組んでいます.MainActivityの文字列で、サービスでそれを呼び出します. 私はこのようなことを試しました:
この次のものは myService.class に入ります
// Service を拡張する myService.class 内
public class myService extends Service{
AlarmManager manager;
PendingIntent pintent;
String te;
@Override
public void onCreate()
{
manager = (AlarmManager)(this.getSystemService(Context.ALARM_SERVICE));
pintent = PendingIntent.getBroadcast( this, 0, new Intent("blahblah"), 0 );}
@Override
public int onStartCommand(Intent intent, int flags, int startid)
{
super.onStartCommand(intent, flags, startid);
te = intent.getStringExtra("tst"); //if I change this line to te = "something", everything goes fine
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive( Context context, Intent intent )
{
Toast.makeText(getApplicationContext(),te, Toast.LENGTH_SHORT).show();
}
};
this.registerReceiver(receiver, new IntentFilter("blahblah") );
// set alarm to fire 30 min and waits 2 min
manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000*30*60, 1000*2*60, pintent);
return START_STICKY;}
public IBinder onBind(Intent p1)
{
// TODO: Implement this method
return null;
}
}
ここでコードは完全に実行されますが、アプリを終了するとクラッシュします。1 分後、アプリがクラッシュしたことがデバイスに再び表示され、アプリが「正常に」バックグラウンドに移行したことが確認されました。それの何が問題なのですか?また、サービスの代わりに IntentService を使用できることも学びました。長いタスクにはどちらが適していますか?それらの違いは何ですか?
編集***
次のエラーを受け取りました: java.lang.NullPointerExeption. だから私はこれを変更します:
te = インテント.getStringExtra("tst");
これに:
試してみてください { te = intent.getStringExtra("tst"); } catch(NullPointerException e) {}
変更すると、アプリはエラーで動作しますが、問題は次のとおりです。MainActivity から文字列を取得する必要があります。アプリを閉じると、サービスはエラーなしで実行されますが、「te」文字列は null 値を取得します。どうすればよいですかサービスに文字列を「保存」し、それを使用してアプリを閉じた後も「動作中」のメッセージを表示し続けるには?SharedPreferences を使用する必要がありますか?
私が明確だったことを願っています。