Android 10でバックグラウンドからアクティビティを開始する方法


12

私は、バックグラウンドからアクティビティを開始する必要があるAndroidアプリを構築しています。これを実現するためにServiceを拡張するForegroundStarterを使用しています。フォアグラウンドサービスから実行する必要があるアクティビティAdscreen.classがあります。アクティビティAdscreen.classは、Android 10を除くすべてのAndroidバージョンで正常に動作します(バックグラウンドから開始)。

ForeGroundStarter.class

public class ForeGroundStarter extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }



    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("sK", "Inside Foreground");

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("sK", "Inside Foreground onStartCommand");
        Intent notificationIntent = new Intent(this, Adscreen.class);
        PendingIntent pendingIntent =
                PendingIntent.getActivity(this, 0, notificationIntent, 0);


        Notification notification =
                null;

        //Launching Foreground Services From API 26+

        notificationIntent = new Intent(this, Adscreen.class);
        pendingIntent =
                PendingIntent.getActivity(this, 0, notificationIntent, 0);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            String NOTIFICATION_CHANNEL_ID = "com.currency.usdtoinr";
            String channelName = "My Background Service";
            NotificationChannel chan = null;
            chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_NONE);
            chan.setLightColor(Color.BLUE);
            chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
            NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            assert manager != null;
            manager.createNotificationChannel(chan);

            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
            notification = notificationBuilder.setOngoing(true)
                    .setSmallIcon(R.drawable.nicon)
                    .setContentTitle("")
                    .setPriority(NotificationManager.IMPORTANCE_MIN)
                    .setCategory(Notification.CATEGORY_SERVICE)
                    .build();
            startForeground(2, notification);


            Intent dialogIntent = new Intent(this, Adscreen.class);
            dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(dialogIntent);
            Log.d("sk", "After startforeground executed");

        }



        else //API 26 and lower
            {
                notificationIntent = new Intent(this, Adscreen.class);
                pendingIntent =
                        PendingIntent.getActivity(this, 0, notificationIntent, 0);

                notification =
                        new Notification.Builder(this)
                                .setContentTitle("")
                                .setContentText("")
                                .setSmallIcon(R.drawable.nicon)
                                .setContentIntent(pendingIntent)
                                .setTicker("")
                                .build();

                startForeground(2, notification);
                Intent dialogIntent = new Intent(this, Adscreen.class);
                dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(dialogIntent);
            }




        return super.onStartCommand(intent, flags, startId);

    }
}

Android 10のバックグラウンドからのアクティビティの開始にはいくつかの制限があることを読みました。このコードはもう機能していないようです。 https://developer.android.com/guide/components/activities/background-starts

Intent dialogIntent = new Intent(this, Adscreen.class);
            dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(dialogIntent);

Android 10でバックグラウンドからアクティビティを開始するための回避策はありますか?


適切な解決策はありますか?
Vishal Patel

何かを見つけますか?
WorieN

解決策は見つかりましたか?
Hamza Ezzaydia

回答:


4

このようにするのが正しいかどうかはわかりませんが、十分な時間がありませんでした(アプリは会社の内部使用専用です)。

私は許可を使用しました:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

そして、すべてのユーザーは設定に行く必要があります->アプリの権限、そして機能の詳細設定のチェックボックス「他のアプリの上にアプリを表示する」

私の英語では申し訳ありませんが、正確な解決策ではありませんが、うまくいきました。

Pixel 4では、次のようになります。 ここに画像の説明を入力してください


3

バックグラウンドからの活動開始の制限について述べたように

それは述べられています

Android 10(APIレベル29)以降では、アプリがバックグラウンドで実行されているときに、アプリがアクティビティを開始できるタイミングが制限されています。

彼らはまた彼らのノートで言及したことはそれです。

注:アクティビティを開始するために、フォアグラウンドサービスを実行しているアプリは「バックグラウンド」にあると見なされます

つまり、フォアグラウンドサービスを使用してアクティビティを開始している場合でも、アプリはバックグラウンドにあると見なされ、アプリアクティビティは起動されません。

解決策:まず、アプリがAndroid 10(APIレベル29)以降のバックグラウンドで実行されている場合、アプリを起動できません。彼らはこの動作を克服する新しい方法を提供しました。つまり、アプリを呼び出す代わりに、フルスクリーンインテントで優先度の高い通知表示できます

フルスクリーンインテントは、デバイスの画面がオフの場合などに動作し、必要なアプリアクティビティを起動します。アプリがバックグラウンドで画面がオンの場合は、通知が表示されるだけです。通知をクリックすると、アプリが開きます。

優先度の高い通知とフルスクリーンインテントの詳細については、こちらで確認できます時間に敏感な通知を表示します


2

以下の権限をAndroidManifest.xmlに含める必要があります。

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

私もこの問題に直面していますが、この解決策はうまく
いき

@RohitSharmaはこの問題の解決策をまだ見つけましたか?またはまだ奇跡を待っています。
asadullah

まだこの問題に直面しているので、そのための完璧な解決策はありませんでした。
Rohit Sharma

解決策は見つかりましたか?
Hamza Ezzaydia
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.