2011-02-05 27 views
5

Tôi đang chặn tin nhắn sms với một số thông tin trong đó. Sau đó, trong SmsListener của tôi, tôi đang tạo thông báo để hiển thị trong thanh trạng thái. Sau đó, khi người dùng nhấp vào một thông báo tôi muốnLàm cách nào để đưa Hoạt động lên nền trước (hoặc tạo nếu không tồn tại)?

  1. Mang MainActivity để foreground (Nếu hoạt động như vậy không tồn tại nhưng nó nên được tạo ra)
  2. Pass để nó dữ liệu từ sms
  3. Thực hiện một số giao diện người dùng thay đổi dựa trên dữ liệu này trong MainActivity này

hoạt động của tôi được định nghĩa là

<activity 
     android:name=".MainActivity" 
     android:screenOrientation="sensor" 
     android:label="@string/app_name" 
     android:launchMode="singleTask"/> 

Hoạt động được đưa ra như

Intent i = new Intent(); 
i.setClass(context, MainActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(i); 

Cũng trong hoạt động của tôi, tôi đã ghi đè phương pháp onNewActivity

@Override 
public void onNewIntent(Intent intent){ 
    super.onNewIntent(intent); 

    // I have data from broadcast in intent variable passed to this activity 
    processDataFromBroadcast(intent); 
} 

Nó hoạt động tốt nếu MainActivity đã tồn tại nhưng nếu MainActivity không tồn tại nó được bắt đầu tuy nhiên onNewIntent không được gọi là

Sau đó, tôi đã cố gắng gọi processDataFromBroadcast từ onCreate: processDataFromBroadcast(getIntent()). Dữ liệu thời gian đầu tiên được truyền chính xác từ chương trình phát sóng của tôi đến hoạt động. Tuy nhiên nếu MainActivity được gửi đến nền và sau đó lại được đưa đến foreground hoặc onCreate hoặc onNewIntent được gọi và processDataFromBroadcast được thực hiện lại với mục đích được gửi bởi phát sóng và do đó MainActivity của tôi được cập nhật với dữ liệu từ phát sóng mọi thời gian ứng dụng được đưa vào nền trước - thứ hai là không mong muốn, làm thế nào tôi có thể làm cho hoạt động của tôi quên đi ý định này sau lần xử lý đầu tiên. Here is sample application.

Trả lời

5

Để một hoạt động chỉ khởi chạy một phiên bản của chính nó, hãy xem phần tử kê khai <activity> và đặc biệt là android:launchMode. Bạn muốn định cấu hình với singleTask hoặc singleInstance.

Để chuyển dữ liệu đến hoạt động của bạn, bạn thêm dữ liệu vào số Intent bạn sử dụng để mở nó. Để chuyển dữ liệu với mục đích, hãy sử dụng các phương pháp putExtra() của mục đích trước khi gửi đi và getExtra() các phương pháp để truy xuất chúng trong hoạt động nhận của bạn.

Tôi giả sử rằng bạn biết khoảng cách hoạt động của tính năng, nhưng nếu không bạn có thể tìm hiểu thêm về các ý định bằng cách xem this bài viết dành cho nhà phát triển Android.

+0

Cảm ơn bạn đã trả lời. Tuy nhiên, vui lòng xem nội dung cập nhật của tôi cho câu hỏi. – Solvek

+0

Hoạt động có phương thức getIntent() để truy lục mục đích đã kích hoạt hoạt động. Nếu bạn chỉ muốn xử lý ý định trên instantiation đầu tiên, bạn có thể làm điều này từ onCreate(). Như bạn có thể biết, onCreate() chỉ được gọi khi hoạt động chưa có trong bộ nhớ. – rogerkk

+0

Hmm, xin lỗi, tôi thấy tôi không đọc bản cập nhật của bạn đúng cách như bạn đã thử. Tôi đang làm khá nhiều chính xác những gì bạn đang làm trong một trong các ứng dụng của tôi, và sự khác biệt duy nhất tôi có thể thấy ngay bây giờ là tôi đang sử dụng singleInstance launchmode và đã đặt android: alwaysRetainTaskState thành true. My onCreate() chắc chắn không được kích hoạt khi mở lại hoạt động. – rogerkk

1

trong trường hợp vấn đề của bạn vẫn chưa được giải quyết, như tôi đã chỉ chạy vào cùng một vấn đề, đây là cách tôi giải quyết nó:

Tôi đặt một dấu thời gian như intentId như thêm vào mục đích trong đó là sáng tạo. lần đầu tiên, tôi đang xử lý ý định trong onCreate() hoặc onNewIntent() Tôi đang đọc intentId và lưu trữ nó như là mục đích cuối cùng được xử lý. do đó, lần sau onCreate() hoặc onNewIntet() được gọi tôi có thể kiểm tra intentId và nếu nó bằng id của ý định cuối cùng được xử lý, tôi bỏ qua nó! Nó không biết nếu điều này giúp trong trường hợp của bạn, có thể bạn có thể áp dụng nó.

Để giữ intentId độc lập với vòng đời hoạt động, bạn có thể duy trì nó trong các giá trị mặc định.

Tôi đồng ý rằng người ta mong đợi gọi số setIntent(new Intent()) trong số onNewIntent sẽ thực hiện thủ thuật.

0

Trả lời muộn, nhưng có thể hữu ích cho những người khác đang tìm giải pháp.

Chỉ cần thêm bên dưới dòng mã:

Intent mIntent = new Intent(this, SplashActivity.class); 
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // You need this if starting the activity from a service 
mIntent.setAction(Intent.ACTION_MAIN); 
mIntent.addCategory(Intent.CATEGORY_LAUNCHER); 

đâu SplashActivity là tên của ứng dụng ban đầu mà là màn hình đầu tiên của ứng dụng của bạn.

Hy vọng điều đó sẽ hữu ích. :)

Các vấn đề liên quan