Я зацикливаюсь на одном вопросе уже больше месяца. Я хочу запустить широковещательный приемник из класса Android WorkManager. Я хочу получать / фильтровать все входящие текстовые сообщения, а затем отправлять их на сервер. Однако мое текущее решение не может работать в течение многих часов, пока система Android не убьет приложение и синхронизация приемника не остановится, или к тому времени, когда я извлечу текстовое сообщение из объекта PDU (исходящего из телефонного намерения), метод onReceive уже был возвращен. Поэтому, чтобы решить эту проблему, я хочу, чтобы метод onReceive продолжал работать внутри WorkManager, чтобы гарантировать, что процесс не завершится так быстро. Я пробовал читать, но я не получаю того решения, которое хорошо работает со мной, или, может быть, мне что-то непонятно о широковещательном приемнике или о том, как работают фоновые процессы Android. Это моя текущая реализация. Ниже приведен метод onReceive (), реализованный в MessageReceiver, который расширяет BroadcastReceiver.
@TargetApi(Build.VERSION_CODES.M)
@Override
public void onReceive(final Context context, Intent intent) {
this.context= context;
if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())) {
final Bundle data = intent.getExtras();
if (data !=null ) {
try {
final Object[] pdusObj = (Object[]) data.get("pdus");
if (pdusObj != null) {
for (int i = 0; i < pdusObj.length; i++) {
SmsMessage currentMessage =
SmsMessage.createFromPdu((byte[]) pdusObj[i]);
Log.d(TAG, "run: currentMessage: " + currentMessage);
Log.d(TAG, "passReceivedMsg: handleMessage: message " + currentMessage);
int msgNo = counter++;
msgID = "SMS_ID_0" + msgNo;
sender = currentMessage.getDisplayOriginatingAddress();
text_message = currentMessage.getDisplayMessageBody();
long timestampMilliseconds = System.currentTimeMillis();
timestamp = formatter.format(timestampMilliseconds);
Data.Builder dataBuilder = new Data.Builder();
dataBuilder.putString("sender",sender);
dataBuilder.putString("message",text_message);
dataBuilder.putString("timestamp",timestamp);
dataBuilder.putString("sms_id",msgID);
// Log.d(TAG, "onReceive: key:" +key+ " and keyValue "+data.get(key));
WorkManager mWorkManager = WorkManager.getInstance();
OneTimeWorkRequest mRequest = new OneTimeWorkRequest
.Builder(MessageSyncWorker.class)
.setInputData(dataBuilder.build())
.build();
mWorkManager.enqueue(mRequest);
}
}
}
catch (Exception e){
Log.d(TAG, "onReceive: Exception occured "+e.getMessage());
}
}
}
}
Ниже мой класс MessageSyncWorker, расширяющий метод WorkerdoWork ().
@NonNull
@Override
public Result doWork() {
Data inputData1 = getInputData();
sender = inputData1.getString("sender");
text_message = inputData1.getString("message");
timestamp = inputData1.getString("timestamp");
msgID = inputData1.getString("sms_id");
Log.d(TAG, "doWork: Mesage "+text_message);
SharedPreferences sharedPreferences =
PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
BASE_API_URL = sharedPreferences.getString("settings_server_url", "");
Log.d(TAG, "doWork: BASE URL "+BASE_API_URL);
try {
//here I upload the data to the server
uploadMessageData();
} catch (JSONException e) {
e.printStackTrace();
Log.d(TAG, "doWork: uploadMessage method Exception "+e.getMessage());
}
return Result.success();
}