Android เริ่มกิจกรรมจากบริการ


151

Android:

public class LocationService extends Service {

@Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        startActivity(new Intent(this, activity.class));
    }
}

ฉันเปิดตัวบริการนี้จาก Activity

ในActivityกรณีที่เงื่อนไขตรงเริ่มต้น

startService(new Intent(WozzonActivity.this, LocationService.class));

จากที่LocationServiceกล่าวไว้ข้างต้นไม่สามารถเปิดActivityได้ฉันจะรับบริบทของการทำงานActivityในปัจจุบันในระดับบริการได้อย่างไร

คำตอบ:


344

จากภายในชั้นบริการ:

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

17
จำเป็นต้องมี FLAG_ACTIVITY_NEW_TASK เนื่องจากกิจกรรมเท่านั้นที่อาจเริ่มต้นกิจกรรมที่ไม่มีกิจกรรม 'this' สามารถใช้แทน getBaseContext และ getApplication เนื่องจากบริการมีบริบทของตัวเอง
Sojurn

1
วิธีการลบกิจกรรมนั้นโดยทางโปรแกรมจากรายการหน้าจอล่าสุด
Prashanth Debbadwar

2
ไม่ทำงานหากบริการอยู่ในพื้นหลัง การแก้ไขใด ๆ สำหรับเรื่องนี้?
Rick Royd Aban

4
โปรดช่วยฉันเปิดแอปพลิเคชันจากบริการพื้นหลังฉันใช้บริการ Firebase (FCM) ฉันต้องการเปิดหน้าจอ UI การโทรของฉันจากแอพของฉันดังนั้นโปรดช่วยฉันด้วย
Dipanki Jadav

2
ฉันเขียนโค้ดของคุณในบริการของฉันเมื่อแอปอยู่ในพื้นหลังและฉันเห็นว่าบริการทำงานบน xiaomi mi a2 แต่ไม่ทำงานบน xiaomi redmi note 7 คุณสามารถช่วยฉันได้หรือไม่ว่าทำไมมันถึงใช้งานอุปกรณ์เครื่องหนึ่งไม่ได้
Amjad Omari

18

ฉันมีปัญหาเดียวกันและต้องการแจ้งให้คุณทราบว่าไม่มีข้อใดถูกสำหรับฉัน สิ่งที่ทำงานให้ฉันคือ:

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

และในคลาสย่อยหนึ่งของฉันเก็บไว้ในไฟล์แยกต่างหากฉันต้อง:

public static Service myService;

myService = this;

new SubService(myService);

Intent dialogIntent = new Intent(myService, myActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
myService.startActivity(dialogIntent);

ทุกคำตอบอื่น ๆ nullpointerexceptionให้ฉัน


5
คุณกำลังจัดเก็บบริการในฟิลด์คงที่ซึ่งอาจนำไปสู่การรั่วไหลของหน่วยความจำ
Murmel

1
startActivity เป็นแบบเดียวกันนี้เริ่มต้นการทำงาน! คุณสร้างอินสแตนซ์ที่ไร้ประโยชน์จากบริการของคุณด้วยการเริ่มต้นปกติเท่ากับปกติทำไม?
Amir Hossein Ghasemi

8

สิ่งที่ควรค่าแก่การกล่าวถึง: ในขณะที่คำตอบข้างต้นใช้ได้ดีเมื่องานของเราอยู่ในพื้นหลังวิธีเดียวที่ฉันสามารถทำให้มันทำงานได้ถ้างานของเรา (บริการ + กิจกรรมบางอย่าง) อยู่ในเบื้องหน้า (เช่นหนึ่งในกิจกรรมของเรา ถึงผู้ใช้) เป็นเช่นนี้:

    Intent intent = new Intent(storedActivity, MyActivity.class);
    intent.setAction(Intent.ACTION_VIEW);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    storedActivity.startActivity(intent);

ฉันไม่ทราบว่า ACTION_VIEW หรือ FLAG_ACTIVITY_NEW_TASK มีการใช้งานจริงที่นี่หรือไม่ กุญแจสู่ความสำเร็จคือ

storedActivity.startActivity(intent);

และแน่นอน FLAG_ACTIVITY_REORDER_TO_FRONT สำหรับการไม่ทำให้กิจกรรมเกิดขึ้นอีก ขอให้โชคดี!


1
สิ่งนี้ใช้ไม่ได้ ทั้งหมดนี้ทำให้ฉันมีข้อผิดพลาด "การเรียก startActivity () จากด้านนอกของบริบทกิจกรรมต้องมีการตั้งค่าสถานะ FLAG_ACTIVITY_NEW_TASK นี่คือสิ่งที่คุณต้องการจริง ๆ หรือไม่"
Cerin

2
นี่เป็นเพราะการเรียกครั้งที่สองเพื่อ setFlags แทนที่อันแรก โซลูชันนี้ควรใช้ addFlags หรือการโทรครั้งเดียวเพื่อตั้งค่าสถานะที่ผ่าน Intent FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
เฟอร์กัสมา

8
คุณไม่ต้องการรวมค่าสถานะกับ &&; คุณต้องการใช้ | (แถบเดียวสำหรับ bitwise หรือ)
Jon Watte

เจตนาเจตนา = เจตนาใหม่ (เก็บไว้กิจกรรม, MyActivity.class); intent.setAction (Intent.ACTION_VIEW); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); storedActivity.startActivity (เจตนา);
Prakhar1001

1

หนึ่งไม่สามารถใช้ContextของService; สามารถรับ (แพ็คเกจ) Contextเหมือนกัน:

Intent intent = new Intent(getApplicationContext(), SomeActivity.class);

ฉันคิดว่ามันใช้ได้กับFLAG_ACTIVITY_NEW_TASKธงเท่านั้น
Cerlin

0

อีกวิธีหนึ่งคือ

คุณสามารถใช้คลาสแอปพลิเคชันของคุณเองและโทรจากที่ใดก็ได้ที่คุณต้องการ (โดยเฉพาะอย่างยิ่งที่ไม่ใช่กิจกรรม)

public class App extends Application {

    protected static Context context = null;

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }

    public static Context getContext() {
        return context;
    }

}

และลงทะเบียนคลาสแอปพลิเคชันของคุณ:

<application android:name="yourpackage.App" ...

จากนั้นโทร:

App.getContext();

2
ดูแลการใช้อินสแตนซ์แบบคงที่ของบริบทมันสามารถนำไปสู่การรั่วไหลของความ
จำรุนแรง

1
@crgarridos Nope นี่คือบริบทของแอปพลิเคชันซึ่งเป็นซิงเกิลโดยธรรมชาติและจะไม่นำไปสู่การรั่วไหลของหน่วยความจำ
GV_FiQst

1
ฉันจะเปลี่ยนสายcontext = getApplicationContext();เป็นcontext = this;
GV_FiQst

-1

หากคุณต้องการเรียกใช้กิจกรรมที่อยู่ใน bacgrounde อีกครั้งจากบริการของคุณฉันขอแนะนำลิงก์ต่อไปนี้ เจตนาไม่ใช่ FLAG_ACTIVITY_NEW_TASK ไม่ใช่วิธีแก้ปัญหา

https://stackoverflow.com/a/8759867/1127429

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