2017-06-28 3 views
2

Ich habe einen Broadcast-Empfänger in einem Service. Der Dienst sollte einen Alarmmanager starten und der Broadcast-Empfänger sollte den Alarm erhalten. Der Dienst wird nach dem Neustart des Geräts von einem anderen Broadcast-Empfänger gestartet. aber mein Code gibt folgende Ausnahme und App-Abstürze. Wie kann ich das beheben?Broadcast-Empfänger in einem Service funktioniert nicht

06-28 17:26:20.983 6924-6924/com.example.krishan.timertest E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.example.krishan.timertest, PID: 6924 
    java.lang.RuntimeException: Unable to instantiate receiver com.example.krishan.timertest.MyService$AlarmReceiver: java.lang.InstantiationException: class com.example.krishan.timertest.MyService$AlarmReceiver has no zero argument constructor 
     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2992) 
     at android.app.ActivityThread.access$1800(ActivityThread.java:177) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1507) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5910) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200) 
    Caused by: java.lang.InstantiationException: class com.example.krishan.timertest.MyService$AlarmReceiver has no zero argument constructor 
     at java.lang.Class.newInstance(Class.java:1681) 
     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2987) 
     at android.app.ActivityThread.access$1800(ActivityThread.java:177)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1507)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:135)  
     at android.app.ActivityThread.main(ActivityThread.java:5910)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at java.lang.reflect.Method.invoke(Method.java:372)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)  
    Caused by: java.lang.NoSuchMethodException: <init> [] 
     at java.lang.Class.getConstructor(Class.java:531) 
     at java.lang.Class.getDeclaredConstructor(Class.java:510) 
     at java.lang.Class.newInstance(Class.java:1679) 
     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2987)  
     at android.app.ActivityThread.access$1800(ActivityThread.java:177)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1507)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:135)  
     at android.app.ActivityThread.main(ActivityThread.java:5910)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at java.lang.reflect.Method.invoke(Method.java:372)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200) 

Mein Service

public class MyService extends Service { 

    public MyService() { 
    } 

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

    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO: Return the communication channel to the service. 
     throw new UnsupportedOperationException("Not yet implemented"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     Log.d("timer test", "*********************" + " Service Started " + "*********************"); 
     startAlert(); 

     return START_STICKY; 
    } 

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

    public void startAlert() { 
     Intent intent = new Intent(this, AlarmReceiver.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, 0); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), (60 * 1000), pendingIntent); 
     Toast.makeText(this, "Alarm set in 60 seconds", Toast.LENGTH_LONG).show(); 
    } 

    public class AlarmReceiver extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.d("Timer Test", "*********************" + " Alarm" + "*********************"); 
     } 
    } 
} 

Mein Rundfunkempfänger ausgelöst, wenn Boot

public class BootReceiver extends BroadcastReceiver { 

    private Intent ServiceIntent; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     ServiceIntent = new Intent(context, MyService.class); 
     context.startService(ServiceIntent); 


     Toast.makeText(context, "Boot Receiver", Toast.LENGTH_LONG).show(); 
     Intent intentx = new Intent(context, MainActivity.class); 
     intentx.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(intentx); 

    } 

} 

Mein Manifest

01 abgeschlossen

Dies funktioniert ordnungsgemäß, wenn ich den Broadcast-Empfänger als separate Klasse deklariert habe. Aber ich möchte es im Service deklarieren.

+0

überprüfen Sie bitte, ob Ihr Dienst gerade beginnt oder nicht. –

Antwort

1

AlarmReceiver Klasse statisch sein sollte, hoffe, es hilft.

+0

Ja! es funktionierte. Vielen Dank. –

0

Ich habe etwas ähnliches, registrieren die batteryBroadcast und die ScreenOn/ScreenOf Sendung zu, überprüfen Sie den Code:

public class turnOnScreenService extends Service { 



    private BroadcastReceiver mScreenStateReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String strAction = intent.getAction(); 

      if (strAction.equals(Intent.ACTION_SCREEN_OFF)) { 
       //do stuff 
      } else if (strAction.equals(Intent.ACTION_SCREEN_ON)) { 
       //do more stuff 
      } 
     } 
    }; 

    private BroadcastReceiver mBatteryStateReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) { 
       // more stuff 

      } else { 
       // more stuff 
      } 
     } 
    }; 


    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     IntentFilter screenStateFilter = new IntentFilter(); 
     screenStateFilter.addAction(Intent.ACTION_SCREEN_ON); 
     screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); 
     registerReceiver(mScreenStateReceiver, screenStateFilter); 


     IntentFilter ifilter = new IntentFilter(); 
     ifilter.addAction(Intent.ACTION_POWER_CONNECTED); 
     ifilter.addAction(Intent.ACTION_POWER_DISCONNECTED); 
     registerReceiver(mBatteryStateReceiver, ifilter); 
    } 


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.i("LocalService", "Received start id " + startId + ": " + intent); 

     return START_NOT_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     unregisterReceiver(mScreenStateReceiver); 
     unregisterReceiver(mBatteryStateReceiver); 
    } 


} 
+0

Was ist die Aktion, die ich hier mit 'intentionFilter.addAction()' verwenden sollte –

+0

Intent.ACTION_BOOT_COMPLETED Bitte, upvote die Antwort –

+0

Es gibt kein Problem mit dem Boot Empfang Broadcast-Empfänger. Indem ich die innere Klasse in den Dienst stellte, löste sich mein Problem. –

Verwandte Themen