Bir hizmet oluştururken boş kurucu yok


98

Bu hatayla mücadele ediyorum:

08-08 11: 42: 53.179: E / AndroidRuntime (20288): Neden olduğu: java.lang.InstantiationException: com.example.localnotificationtest.ReminderService sınıfı başlatılamıyor; boş kurucu yok

Bu hatanın neden oluştuğunu anlamıyorum.

Belirli bir zamanda bildirim göstermeye çalışıyorum ve bir süre aradıktan sonra bu eski stackoverflow sorusunu buldum . Her şeyi denedim ama kodum hata veriyor.

Lütfen bu sorunu çözmeme yardım edin.

İşte MainActivity kodum:

public class MainActivity extends Activity {
    int mHour, mMinute;
    ReminderService reminderService;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        reminderService = new ReminderService("ReminderService");

        TimePickerDialog dialog = new TimePickerDialog(this, mTimeSetListener, mHour, mMinute, false);
        dialog.show();
    }

    TimePickerDialog.OnTimeSetListener mTimeSetListener =  new OnTimeSetListener() {

        @Override
        public void onTimeSet(TimePicker v, int hourOfDay, int minute) {
            mHour = hourOfDay;
            mMinute = minute;

            AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
            Calendar c = Calendar.getInstance();
            c.set(Calendar.YEAR, Calendar.YEAR);
            c.set(Calendar.MONTH, Calendar.MONTH);
            c.set(Calendar.DAY_OF_MONTH, Calendar.DAY_OF_MONTH);
            c.set(Calendar.HOUR_OF_DAY, mHour);
            c.set(Calendar.MINUTE, mMinute);
            c.set(Calendar.SECOND, 0);

            long timeInMills = c.getTimeInMillis();

            Intent intent = new Intent(MainActivity.this, ReminderService.class);
            PendingIntent pendingIntent = PendingIntent.getService(MainActivity.this, 0, intent, 0);
            alarmManager.set(AlarmManager.RTC, timeInMills, pendingIntent);
        }
    };

}

ve işte ReminderService kodum:

public class ReminderService extends IntentService {

    public ReminderService(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 1, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

        NotificationManager nm = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

        Notification.Builder builder = new Notification.Builder(this);

        builder.setContentIntent(contentIntent)
            .setSmallIcon(R.drawable.ic_launcher)
            .setTicker("Local Notification Ticker")
            .setWhen(System.currentTimeMillis())
            .setAutoCancel(true)
            .setContentTitle("Local Notification")
            .setContentText("This is content text.");
         Notification n = builder.getNotification();

         nm.notify(1, n);
    }

}

ve işte manifest.xml dosyam:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.localnotificationtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"  android:label="@string/app_name"  android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity"  android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="ReminderService"></service>
    </application>

</manifest>

Nerede yanlış yaptığımı bilmiyorum. Bazı kodları mı kaçırıyorum?

Yanıtlar:


221

Sınıfınıza boş bir kurucu eklemeniz gerekir, yani argüman içermeyen bir tane:

public ReminderService() {
    super("ReminderService");
}

Belgelerden açıklama :

nameİşçi iş parçacığı adlandırmak için kullanılır.

NOT : Bu, yalnızca amaçlı hizmet için geçerlidir.


9
Kalın olduğunu hiçbir argüman ile Oluşturucu
Pratik Butani

44

Hizmetinizin bir İç Sınıf / İç İçe Sınıf olarak bildirilmesi durumunda, sınıfı da statik hale getirmeniz gerekir.

Bu olmadan kurucunuz doğru olsa bile hatayı alırsınız

Açıklama

Bunun nedeni, yalnızca iç sınıfları dış sınıf bağlamında başlatabilirsiniz, bu nedenle önce dış sınıfın bir örneğini oluşturmanız gerekir.

İç sınıfınızın statik olduğunu bildirmek, onu dış sınıfından bağımsız kılar



Herhangi bir yerde belgelenip belgelenmediğini bilmiyorum, ancak statik olmayan iç sınıfları somutlaştırmak istiyorsanız, önce dış sınıfın somutlaştırılması gerekir. Şimdi bir hizmeti başlatırsanız, örnek sistem tarafından oluşturulur ve bu sistem önce dış sınıftan bir örnek oluşturması gerektiğini bilmez, bu nedenle çökecektir. Ancak bu durumda hata gerçekten yanıltıcıdır. stackoverflow.com/questions/70324/… 'e
Marian Klühspies

32

Bir beyan varsayılan no-argüman yapıcı için IntentService

public class ReminderService extends IntentService {
    public ReminderService() {
      super("ReminderService");
    }
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.