BroadcastReceiver - Не удается запустить действие из закрытого или фонового приложения - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь запустить действие из закрытого приложения, используя AlarmManager и BroadcastReceiver. «Полученное» отладочное сообщение отображается, даже когда приложение закрыто или находится в фоновом режиме, что означает, что AlarmManager работает так, как я хочу. Но CameraActivity запускается только тогда, когда приложение активно. У кого-нибудь есть идея, почему она не работает? Вот (некоторые из) мой код:

MainActivity:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ...

        Intent intent = new Intent(this, AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

        alarmManager.setRepeating(
                AlarmManager.RTC_WAKEUP,
                startTimeStamp,
                intervalTime,
                pendingIntent);

        Log.i("########################DEBUG", "started");
    }
}

AlarmReceiver

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("########################DEBUG", "received");

        Intent launchIntent = new Intent(context, CameraActivity.class);
        launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
        context.startActivity(launchIntent);

        /* Tried this too, didn't work
        PackageManager packageManager = context.getPackageManager();
        Intent launchIntent = packageManager.getLaunchIntentForPackage(CameraActivity.class.getName());
        context.startActivity(launchIntent);*/
    }
}

CameraActivity

public class CameraActivity extends AppCompatActivity {

    private final int CAMERA_REQUEST = 1;

    private ImageView image;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);

        image = findViewById(R.id.imageview);

        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //startActivityForResult(cameraIntent, CAMERA_REQUEST);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if (resultCode == RESULT_OK && requestCode == CAMERA_REQUEST) {
            Bitmap photo = (Bitmap) data.getExtras().get("data");
            image.setImageBitmap(photo);
        }
    }
}

манифест. xml

    <application

        ...

        <activity android:name=".CameraActivity">
        </activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".AlarmReceiver" />
    </application>

Заранее спасибо!

1 Ответ

0 голосов
/ 08 января 2020

Согласно документации из Android 10, вы не можете запустить действие, когда ваше приложение работает в фоновом режиме, за исключением очень ограниченных случаев, связанных с взаимодействием с пользователем.

Руководство по документации представляет уведомления в качестве альтернативы для запуска действий из фона. Затем в этом руководстве перечислены конкретные c случаи, когда ограничение не применяется. Он предлагает отображать чувствительное ко времени уведомление для предоставления пользователю срочной информации вместо непосредственного запуска действия или полноэкранного режима.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...