วิธีเริ่มกิจกรรมจากพื้นหลังใน Android 10


12

ฉันกำลังสร้างแอพ Android ที่ฉันต้องเริ่มกิจกรรมจากพื้นหลัง ฉันใช้ ForegroundStarter ซึ่งขยายบริการสำหรับการทำสิ่งนี้ให้สำเร็จ ฉันมีกิจกรรม Adscreen.class ซึ่งฉันต้องเรียกใช้จากบริการ Foreground ของฉัน กิจกรรม Adscreen.class ทำงานได้ดี (เริ่มจากพื้นหลัง) ใน Android ทุกรุ่นยกเว้น 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);

    }
}

ฉันอ่านว่ามีข้อ จำกัด บางประการเกี่ยวกับกิจกรรมเริ่มต้นจากพื้นหลังบน 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"/>

ฉันกำลังเผชิญกับปัญหานี้ด้วยเช่นกัน แต่วิธีนี้ไม่ได้ผลสำหรับฉัน
Rohit Sharma

@RohitSharma พบวิธีแก้ปัญหานี้หรือยัง หรือยังรอปาฏิหาริย์อยู่
asadullah

ยังคงเผชิญกับปัญหานี้ฉันไม่ได้รับการแก้ปัญหาที่สมบูรณ์แบบสำหรับการที่
Rohit Sharma

คุณหาทางออกหรือไม่?
Hamza Ezzaydia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.