Я пытаюсь реализовать планирование сигналов тревоги с помощью AlarmManager
. Поскольку при срабатывании будильника я хочу использовать WakefulBroadcastReceiver
, который запускает IntentService
для выполнения некоторой фоновой работы.
У меня есть несколько вопросов, связанных с безопасностью/конфиденциальностью параметров, передаваемых для целей тревоги.
При установке PendingIntent для будильника я делаю что-то вроде:
Intent myIntent = new Intent(context, MyReceiver.class); myIntent.putExtra("test", "testValue"); Bundle bundle = new Bundle(); bundle.putParcelable("bundleValue", bundleTestValue2); myIntent.putExtra("test3", bundle); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 323, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Мой вопрос: насколько приватны значения, установленные как Extra
для pendingIntent будильника? Есть ли шанс, что они будут прочитаны каким-либо другим приложением, поскольку оно используется менеджером Android Alarm после того, как оно запланировано?
Имея такой приемник
public class MyReceiver extends WakefulBroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) { startWakefulService(context, MyIntentService); }
И в манифесте андроида
<receiver
android:name=".receivers.MyReceiver"
android:exported="false"/>
<service
android:name=".MyIntentService"
android:exported="false"/>
И сервис
public class MyIntentService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
try {
//logic here
} catch{
} finaly{
MyReceiver.completeWakefulIntent(intent);
}
}
Позвонить из моей активности
sendBroadcast(new Intent(context, MyReceiver.class).putExtra(...);
Запланировать отложенное намерение из будильника
Intent myIntent = new Intent(context, MyReceiver.class);
myIntent.putExtra("test", "testValue");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 323,
myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
насколько этот ресивер открыт для других приложений? Может ли он реагировать на другие приложения, кроме моего? Возникает ли при этом какие-либо возможные проблемы с безопасностью?
Спасибо.
Позднее редактирование: поскольку WakefullBroadcastReceiver
кажется единственным способом, гарантирующим, что моя служба получит частичную блокировку пробуждения, как я могу на 100% убедиться, что никакие другие приложения не будут знать о моем приемнике и что мой приемник не получит никаких других вызовов, кроме сделанные из моей деятельности или из моего набора Alarm
?
Как будет работать шаблон WakefullBroadcastReceiver
по сравнению с WakefulIntentService CommonsWare?
Позднее редактирование. Наконец-то мне удалось завершить реализацию.
Как указывалось ранее, мои
WakefulBroadcastReceiver
иIntentService
объявлены какexported="false"
в моем манифесте Android, что, насколько я понимаю, означает, что только мое приложение может получить к ним доступ. Поскольку ресивер не экспортируется, принимает ли он трансляции из-за пределов приложения?При установке будильника я использую этот
PendingIntent
:Intent myIntent = new Intent(context, MyReceiver.class);
myIntent.putExtra("databaseId", "1"); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 323, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);При звонке из моей деятельности я делаю:
sendBroadcast(new Intent(context, MyReceiver.class).putExtra("databaseId", "1"));
Этого достаточно?
WakefulBroadcastReceiver
, иWakefulIntentService
используют комбинациюBroadcastReceiver
иIntentService
. Что касается ваших опасений, то они идентичны. - person CommonsWare   schedule 31.01.2017WakefullBroadcastReceiver
, можете ли вы мне что-нибудь сказать? Как я могу убедиться, что егоintent
не читаются другими приложениями или другие приложения не взаимодействуют с ним, отправляя ему широковещательные сообщения? - person Alin   schedule 31.01.2017Intent
, гдеIntent
перенаправляет обратно в ваше собственное приложение. Используйте некоторый идентификатор, который не имеет смысла для посторонних, но указывает, как загружать данные (например, первичный ключ к таблице базы данных). - person CommonsWare   schedule 31.01.2017sendBroadcast
, идет ли моя трансляция в другие приложения или нет... - person Alin   schedule 31.01.2017PendingIntent
, вам не нужно экспортировать этот компонент, поэтому сторонние приложения не должны иметь доступ к вашему приемнику. Каждый раз, когда вы работаете с одним из ваших собственных компонентов (например, вызываетеstartService()
из получателя), вам не нужно экспортировать компонент. Таким образом, у вас не должно быть проблем здесь. Если вы вызываетеsendBroadcast()
с явнымIntent
, широковещательная рассылка идет только к этому получателю; с неявнымIntent
трансляция идет всем зарегистрированным слушателям. - person CommonsWare   schedule 31.01.2017without an implicit Intent, the broadcast goes to all registered listenters
? Я добавил некоторый код, иWakefullBroadcastReceiver
, иIntentService
являютсяexported=false
. Я также добавил, как я либо готовлюPendingIntent
изAlarm
, либо вызываюsendBroadcast
изActivity
приложения. Насколько я понимаю,sendBroadcast
, заявив о намерении, идет только к моему получателю, а не к другим. Также будильник с PendingIntent также поступает на мой приемник. Наличиеexported=false
делает приемник недоступным для других приложений. Правильный? - person Alin   schedule 31.01.2017Intent
похоже наnew Intent(this, YourReceiver.class)
. Это пойдет только кYourReceiver
. НеявноеIntent
похоже наnew Intent("your.custom.action.STRING")
. Это касается любого, кто хочет слушать такие передачи. В вашем случае не используйте<intent-filter>
на<receiver>
и используйте явныйIntent
для вашей трансляции. Или не используйтеsendBroadcast()
, а вместо этого вызовитеIntentService
напрямую в случаях, когда он не срабатывает при тревоге. - person CommonsWare   schedule 31.01.2017WakefullBroadcastReceiver
), поэтому я используюsendBroadcast within my app
. Я пропустил явное/неявное, являющееся разными словами, не то, чтобы я внимательно перечитал, я понимаю. Я отправляю широковещательную рассылку типаsendBroadcast(new Intent(context, MyReceiver.class).putExtra(...)
, чтобы трансляция шла только на мой приемник, а не на другие. - person Alin   schedule 31.01.2017sendBroadcast
с явнымIntent
, трансляция должна идти только на мой приемник. То же самое касаетсяPendingIntent
в случае тревоги. Если они не экспортируются, их нельзя вызывать или прослушивать вне процесса моего приложения, не оставляя угроз безопасности. В качестве предостережения я передаю только некоторые идентификаторы PK из базы данных какExtras
. Я правильно понял? - person Alin   schedule 16.02.2017PendingIntent
. - person CommonsWare   schedule 16.02.2017PendingIntent
, и вызов изActivity
вызывают один и тот жеIntentService
, что означает, что он делает одно и то же, только параметры могут быть разными. Я использовалsendBroadcast
в своей деятельности, чтобы воспользоваться преимуществамиwakelock
, которыеWakefulBroadcastReceiver
обрабатывает сам по себе. Таким образом, приложение, вызываемое либо из Alarm, либо из самого себя, запускаетBroadcastReceiver
, который получает wakelock во время выполненияIntentService
. Например, вызов из действия может занять несколько минут, поэтому мне нужно иметь частичную блокировку пробуждения во время работы IntentService... - person Alin   schedule 16.02.2017