Làm thế nào để bắt đầu một hoạt động từ nền trong Android 10?


12

Tôi đang xây dựng một ứng dụng Android nơi tôi cần bắt đầu một hoạt động từ nền. Tôi đang sử dụng một PremgroundStarter mở rộng Dịch vụ để thực hiện việc này. Tôi có một hoạt động Adscreen. Class mà tôi cần chạy từ dịch vụ Tiền cảnh của mình. Hoạt động Adscreen. Class hoạt động tốt (bắt đầu từ nền) trên tất cả các phiên bản Android ngoại trừ Android 10.

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);

    }
}

Tôi đọc được rằng có một số hạn chế khi bắt đầu các hoạt động từ nền trên Android 10. Mã này dường như không còn hoạt động nữa. 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);

Bất kỳ cách giải quyết nào để bắt đầu một hoạt động từ nền trên Android 10?


Giải pháp nào phù hợp?
Vishal Patel

Tìm hiểu điều gì?
WorieN

Bạn đã tìm thấy một giải pháp?
Hamza Ezzaydia

Câu trả lời:


4

Không chắc chắn liệu có đúng không khi làm theo cách này, nhưng tôi không có đủ thời gian (ứng dụng chỉ dành cho sử dụng nội bộ của công ty).

Tôi đã sử dụng quyền:

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

và sau đó mọi người dùng phải vào cài đặt -> quyền của ứng dụng và sau đó chọn hộp kiểm trong cài đặt nâng cao cho chức năng "hiển thị ứng dụng hơn người khác"

Xin lỗi vì tiếng Anh của tôi hoặc không chính xác là giải pháp đúng, nhưng nó đã hoạt động, vì vậy hotfix tốt cho tôi.

Trên Pixel 4, nó sẽ trông như thế này: nhập mô tả hình ảnh ở đây


3

Như bạn đã đề cập Hạn chế khi bắt đầu các hoạt động từ nền

Nó được tuyên bố rằng

Android 10 (API cấp 29) và giới hạn địa điểm cao hơn về thời điểm ứng dụng có thể bắt đầu hoạt động khi ứng dụng đang chạy ẩn.

Họ cũng đề cập trong ghi chú của họ là vậy.

Lưu ý: Đối với mục đích bắt đầu các hoạt động, một ứng dụng chạy dịch vụ nền trước vẫn được coi là "trong nền"

Điều này có nghĩa là nếu bạn đang sử dụng dịch vụ nền trước để bắt đầu một Hoạt động thì nó vẫn coi Ứng dụng đang ở chế độ nền và sẽ không khởi chạy Ứng dụng Hoạt động.

Giải pháp: Trước tiên, bạn không thể khởi động ứng dụng nếu ứng dụng đang chạy trong nền từ Android 10 (API cấp 29) trở lên. Họ đã cung cấp một cách mới để khắc phục hành vi này, đó là thay vì gọi ứng dụng, bạn có thể hiển thị thông báo ưu tiên cao với mục đích toàn màn hình .

Mục đích toàn màn hình hoạt động như nếu màn hình thiết bị của bạn Tắt Nó sẽ khởi chạy ứng dụng Hoạt động mà bạn muốn. nhưng nếu ứng dụng của bạn ở chế độ nền và màn hình bật thì ứng dụng sẽ chỉ hiển thị thông báo. Nếu bạn nhấp vào thông báo thì nó sẽ mở ứng dụng của bạn.

Để biết thêm thông tin về Thông báo ưu tiên cao và Ý định toàn màn hình, bạn có thể kiểm tra tại đây Hiển thị thông báo nhạy cảm với thời gian


2

Bạn nên bao gồm cho AndroidManifest.xml dưới sự cho phép.

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

tôi cũng đang đối mặt với vấn đề này nhưng giải pháp này không hiệu quả với tôi
Rohit Sharma

@RohitSharma tìm thấy giải pháp nào cho vấn đề này chưa? hoặc vẫn đang chờ đợi bất kỳ phép màu.
Asadullah

Vẫn phải đối mặt với vấn đề này, tôi đã không nhận được bất kỳ giải pháp hoàn hảo cho điều đó.
Rohit Sharma

Bạn đã tìm thấy một giải pháp?
Hamza Ezzaydia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.