मेरे पास एक सेवा के अंदर एक प्रसारण रिसीवर है। सेवा को अलार्म प्रबंधक शुरू करना चाहिए और प्रसारण रिसीवर को अलार्म प्राप्त करना चाहिए। डिवाइस के पुनरारंभ होने के बाद सेवा किसी अन्य प्रसारण रिसीवर द्वारा शुरू की जाती है। लेकिन मेरा कोड निम्नलिखित अपवाद और ऐप क्रैश देता है। मैं इसे कैसे ठीक करूं?

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)

मेरी सेवा

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" + "*********************");
        }
    }
}

बूट पूरा होने पर मेरा प्रसारण रिसीवर चालू हो गया

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);

    }

}

माई मेनिफेस्ट

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.krishan.timertest">

    <uses-permission android:name="android.permission.INTERNET" />

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

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

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true"></service>
        <receiver android:name=".BootReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" >
                </action>
            </intent-filter>
        </receiver>
        <receiver android:name=".MyService$AlarmReceiver"></receiver>
    </application>

</manifest>

अगर मैं प्रसारण रिसीवर को एक अलग वर्ग के रूप में घोषित करता हूं तो यह ठीक से काम करता है। लेकिन मैं इसे सेवा के अंदर घोषित करना चाहता हूं।

2
Krishan Madushanka 28 जून 2017, 15:35

2 जवाब

सबसे बढ़िया उत्तर

अलार्म रिसीवर वर्ग स्थिर होना चाहिए, उम्मीद है कि यह मदद करता है।

1
V.Y. 28 जून 2017, 18:45

मैंने कुछ ऐसा ही किया, बैटरी ब्रॉडकास्ट और स्क्रीनऑन/स्क्रीनऑफ ब्रॉडकास्ट को भी पंजीकृत करें, कोड की जांच करें:

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
Rodrigo Gontijo 28 जून 2017, 16:45