Android bắt đầu hoạt động từ dịch vụ


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

Tôi đã ra mắt dịch vụ này từ Activity

Trong trường Activityhợp điều kiện thỏa mãn bắt đầu

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

từ LocationServiceđề cập ở trên của tôi không thể khởi chạy Activity, làm thế nào tôi có thể có được bối cảnh chạy hiện tại Activitytrong lớp dịch vụ?

Câu trả lời:


344

Từ bên trong lớp Dịch vụ:

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

17
Chỉ FLAG_ACTIVITY_NEW_TASK là cần thiết vì chỉ các hoạt động có thể bắt đầu các hoạt động mà không có nó. 'this' có thể được sử dụng thay cho getBaseContext và getApplication vì dịch vụ có bối cảnh riêng.
Sojurn

1
Làm thế nào để lập trình loại bỏ hoạt động đó khỏi danh sách màn hình gần đây?
Prashanth Debbadwar 2/11/2015

2
Không hoạt động nếu dịch vụ trên nền. Bất kỳ sửa chữa cho điều này?
Rick Royd Aban

4
Xin hãy giúp tôi mở ứng dụng từ dịch vụ nền Tôi đã sử dụng dịch vụ Firebase (FCM). Tôi muốn mở màn hình UI Gọi điện thoại của tôi từ Ứng dụng của tôi Vì vậy, hãy giúp tôi làm điều đó
Dipanki Jadav

2
Tôi đã viết mã của bạn bên trong dịch vụ của mình khi ứng dụng ở chế độ nền và tôi thấy rằng dịch vụ này hoạt động trên điện thoại Xiaomi mi a2, nhưng không hoạt động trên điện thoại Xiaomi redmi note 7, bạn có thể giúp tôi tại sao nó hoạt động một thiết bị và một thiết bị không?
Amjad Omari

18

Tôi đã có cùng một vấn đề, và muốn cho bạn biết rằng không có điều nào ở trên làm việc cho tôi. Những gì làm việc cho tôi là:

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

và trong một lớp con của tôi, được lưu trữ trong một tệp riêng tôi phải:

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

Tất cả các câu trả lời khác đã cho tôi một nullpointerexception.


5
bạn đang lưu trữ Dịch vụ trong trường tĩnh, điều này có thể dẫn đến rò rỉ bộ nhớ
Murmel

1
startActivity cũng giống như vậy.startActivity! bạn tạo một ví dụ vô dụng từ dịch vụ của mình với startActivity bình thường, tại sao?
Amir Hossein Ghasemi

8

Một điều đáng nói nữa: trong khi câu trả lời ở trên chỉ hoạt động tốt khi nhiệm vụ của chúng tôi ở chế độ nền, cách duy nhất tôi có thể làm cho nó hoạt động nếu nhiệm vụ của chúng tôi (được thực hiện bởi dịch vụ + một số hoạt động) nằm ở phía trước (tức là một trong những hoạt động của chúng tôi có thể nhìn thấy cho người dùng) là như thế này:

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

Tôi không biết liệu ACTION_VIEW hay FLAG_ACTIVITY_NEW_TASK có được sử dụng thực tế ở đây không. Chìa khóa để thành công là

storedActivity.startActivity(intent);

và tất nhiên FLAG_ACTIVITY_REORDER_TO_FRONT vì không khởi tạo lại hoạt động. May mắn nhất!


1
Điều này không hoạt động. Tất cả điều này mang lại cho tôi là lỗi "Gọi startActivity () từ bên ngoài ngữ cảnh Hoạt động yêu cầu cờ FLAG_ACTIVITY_NEW_TASK. Đây có thực sự là điều bạn muốn không?"
Cerin

2
Điều này là do lệnh gọi thứ hai đến setFlags ghi đè lên lệnh đầu tiên. Giải pháp này nên sử dụng addFlags hoặc một lệnh gọi để đặt cờ vượt qua Intent.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT.
Fergusmac

8
Bạn không muốn kết hợp cờ với &&; bạn muốn sử dụng | (một thanh duy nhất cho bitwise hoặc)
Jon Watte

Mục đích ý định = Ý định mới (archiveActivity, MyActivity. Class); aim.setAction (Intent.ACTION_VIEW); aim.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); aim.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); archiveActivity.startActivity (ý định);
Prakhar1001

1

người ta không thể sử dụng Contextcái Service; đã có thể nhận được (gói) Contextnhư nhau:

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

Tôi nghĩ rằng điều này chỉ hoạt động với FLAG_ACTIVITY_NEW_TASKcờ
Cerlin

0

Thay phiên,

Bạn có thể sử dụng lớp Ứng dụng của riêng mình và gọi từ bất cứ nơi nào bạn cần (đặc biệt là không hoạt động).

public class App extends Application {

    protected static Context context = null;

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

    public static Context getContext() {
        return context;
    }

}

Và đăng ký lớp Ứng dụng của bạn:

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

Sau đó gọi :

App.getContext();

2
Hãy cẩn thận khi sử dụng một ví dụ tĩnh của bối cảnh, nó có thể dẫn đến rò rỉ bộ
nhớ nghiêm trọng

1
@crgarridos Không. Đây là bối cảnh Ứng dụng, bản chất của Singleton và nó sẽ không dẫn đến rò rỉ bộ nhớ
GV_FiQst

1
Tôi sẽ thay đổi dòng context = getApplicationContext();thànhcontext = this;
GV_FiQst

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.