मेरे पास एक सेवा के अंदर एक प्रसारण रिसीवर है। सेवा को अलार्म प्रबंधक शुरू करना चाहिए और प्रसारण रिसीवर को अलार्म प्राप्त करना चाहिए। डिवाइस के पुनरारंभ होने के बाद सेवा किसी अन्य प्रसारण रिसीवर द्वारा शुरू की जाती है। लेकिन मेरा कोड निम्नलिखित अपवाद और ऐप क्रैश देता है। मैं इसे कैसे ठीक करूं?
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 जवाब
अलार्म रिसीवर वर्ग स्थिर होना चाहिए, उम्मीद है कि यह मदद करता है।
मैंने कुछ ऐसा ही किया, बैटरी ब्रॉडकास्ट और स्क्रीनऑन/स्क्रीनऑफ ब्रॉडकास्ट को भी पंजीकृत करें, कोड की जांच करें:
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);
}
}
संबंधित सवाल
नए सवाल
android
एंड्रॉइड Google का मोबाइल ऑपरेटिंग सिस्टम है, जिसका उपयोग प्रोग्रामिंग या डिजिटल डिवाइस (स्मार्टफोन, टैबलेट, ऑटोमोबाइल्स, टीवी, वियर, ग्लास, IoT) को विकसित करने के लिए किया जाता है। एंड्रॉइड से संबंधित विषयों के लिए, एंड्रॉइड-विशिष्ट टैग जैसे कि एंड्रॉइड-इरादे, एंड्रॉइड-गतिविधि, एंड्रॉइड-एडॉप्टर आदि का उपयोग करें। विकास या प्रोग्रामिंग के अलावा अन्य प्रश्नों के लिए, लेकिन एंड्रॉइड फ्रेमवर्क से संबंधित हैं, इस लिंक का उपयोग करें: https: // android.stackexchange.com।