Почему мой будильник не работает с BOOT_COMPLETED - PullRequest
0 голосов
/ 28 июня 2018

Мое приложение работает, когда мой Android не перезагружается, но когда я выключаю свой Android, приложение не работает, несмотря на добавление BOOT_COMPLETED.

Я искал похожие вопросы, но все они работают так же, как и я, я не знаю, что не так

Manifest

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

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


    <service android:name=".BootService" />

    <receiver
        android:name=".RestartAlarmsReceiver"
        android:enabled="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    <receiver
        android:name=".MyAlarmReceiver"
        android:process=":remote" />

</application>

RestartAlarmsReciver

public class RestartAlarmsReceiver extends BroadcastReceiver {

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

        if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {


            Intent i = new Intent(context, BootService.class);
            ComponentName service = context.startService(i);
        }

    }
}

BootService: все равно, что мой основной AlarmService

public class BootService extends IntentService {
    public BootService(String name) {
        super(name);
    }

    private NotificationManager notificationManager;
    private final int NOTIFICATION_ID = 1010;
    private AdminSQLiteOpenHelper admin;
    private Cursor fila;
    private SQLiteDatabase bd;
    private String alarm, descrip, title;

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Calendar calenda = Calendar.getInstance();
        int hour, min, day, m, year;
        String cadenaF, cadenaH, date_system, time_system;

        day = calenda.get(Calendar.DAY_OF_MONTH);
        m = calenda.get(Calendar.MONTH) + 1;
        year = calenda.get(Calendar.YEAR);
        hour = calenda.get(Calendar.HOUR_OF_DAY);
        min = calenda.get(Calendar.MINUTE);
        date_system = m + "-" + day + "-" + year + " ";
        time_system = hour + ":" + min;
        admin = new AdminSQLiteOpenHelper(getApplicationContext(), vars.bd, null, vars.version);
        bd = admin.getWritableDatabase();

        if (bd != null) {
            fila = bd.rawQuery("SELECT * FROM alarma WHERE datea='" + date_system + "' AND timea= '" + time_system + "'", null);
            if (fila.moveToFirst()) {
                alarm = fila.getString(0);
                title = fila.getString(1);
                descrip = fila.getString(2);
                triggerNotification(getApplicationContext(), title + "\n" + descrip);
            }
        }
        bd.close();
    }

    private void triggerNotification(Context contexto, String t) {
        Intent notificationIntent = new Intent(contexto, MainActivity.class);
        notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent contentIntent = PendingIntent.getActivity(contexto, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        Uri defaultSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        long[] pattern = new long[]{2000, 1000, 2000};

        NotificationCompat.Builder builder = new NotificationCompat.Builder(contexto);
        builder.setContentIntent(contentIntent)

                .setTicker("")
                .setContentTitle("alarm ")
                .setContentTitle("")
                .setContentText(t)
                .setContentInfo("Info")
                .setLargeIcon(BitmapFactory.decodeResource(contexto.getResources(), R.drawable.ic_launcher_background))
                .setSmallIcon(R.drawable.ic_launcher_background)
                .setAutoCancel(true) 
                .setSound(defaultSound)
                .setVibrate(pattern);

        Notification notificacion = new NotificationCompat.BigTextStyle(builder)
                .bigText(t)
                .setBigContentTitle("example")
                .setSummaryText("more example")
                .build();

        notificationManager = (NotificationManager) contexto.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(NOTIFICATION_ID, notificacion);
    }

}

Спасибо

1 Ответ

0 голосов
/ 28 июня 2018

Можете ли вы изменить свой приемник, чтобы добавить экспорт и категорию?

<receiver android:name=".RestartAlarmsReceiver" android:enabled="true" android:exported="true">
    <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED" />
         <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>            
</receiver>

Согласно официальной документации

андроид: экспортироваться

Может ли широковещательный приемник принимать сообщения от источников за пределами его приложения - "истина", если он может, и "ложь", если нет. Если установлено значение «ложь», единственные сообщения, которые может принимать получатель широковещательной рассылки, - это сообщения, отправленные компонентами одного и того же приложения или приложений с одинаковым идентификатором пользователя. Значение по умолчанию зависит от того, содержит ли широковещательный приемник фильтры намерений. Отсутствие каких-либо фильтров означает, что он может быть вызван только объектами Intent, которые указывают его точное имя класса. Это подразумевает, что получатель предназначен только для внутреннего использования приложения (поскольку другие обычно не знают имя класса). Так что в этом случае значением по умолчанию является «ложь». С другой стороны, наличие хотя бы одного фильтра подразумевает, что приемник широковещания предназначен для приема намерений, транслируемых системой или другими приложениями, поэтому по умолчанию установлено значение «true».

Этот атрибут не является единственным способом ограничения внешнего воздействия приемника вещания. Вы также можете использовать разрешение для ограничения внешних объектов, которые могут отправлять ему сообщения (см. Атрибут разрешения).

Надеюсь, это поможет

...