2011-09-09 2 views
14

Nói chung, khi tôi có thông báo thông báo trên thanh thông báo và nhấp vào nó. Nó mở ứng dụng đã đăng ký cho tin nhắn đó.Cách xác định xem ứng dụng Android có mở từ Thông báo thông báo không?

Hoạt động của Startup, Cách xác định xem ứng dụng có đang mở không?

và tốt hơn nữa là cách truy xuất id của thông báo trên phương thức OnCreate()?

Cập nhật: từ @Ovidiu - đây là mã của tôi để putExtra để đẩy

 Notification notification = new Notification(icon, tickerText, System.currentTimeMillis()); 
     notification.contentView = contentView; 

     Intent notificationIntent = new Intent(this, Startup.class); 
     notificationIntent.putExtra("JOBID", jobId); 

     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_ONE_SHOT); 

     notification.flags = Notification.FLAG_AUTO_CANCEL; 
     notification.contentIntent = contentIntent; 


     mNotificationManager.notify(jobId, notification); 

và trên chính Hoạt động "Startup.java" code đang

Intent intent = this.getIntent(); 
    if (intent != null && intent.getExtras() != null && intent.getExtras().containsKey("JOBID")) { 
     int jobID = this.getIntent().getExtras().getInt("JOBID"); 

     if (jobID > 0) { 

     } 
    } 

intent.getExtras() luôn trả về null. Hóa ra, tôi cần phải vượt qua PendingIntent.FLAG_ONE_SHOT. Nó bây giờ được thông qua cùng !!

+0

"cần vượt qua PendingIntent.FLAG_ONE_SHOT" - thực sự hữu ích. Nhưng bạn cần phải kiểm tra một thứ khác - nếu Hoạt động này đến từ lịch sử. Kiểm tra câu trả lời của tôi dưới đây. – Khobaib

Trả lời

14

Bạn cần phải sử dụng putExtra(ID_KEY,id) khi bạn tạo Intent của bạn để bắt đầu ứng dụng của bạn, và trong phương pháp onCreate() của bạn, bạn có thể sử dụng getIntent().getExtras().getInt(ID_KEY); để lấy id bạn đã vượt qua integer.

+1

Hãy coi chừng rằng trừ khi mục đích mới của bạn trả về .equals() == false so với ý định cuối cùng được sử dụng, ý định cuối cùng sẽ được sử dụng. Các phần bổ sung không được xem xét bằng .equals, do đó bạn cần phải đặt một số định danh duy nhất trong setAction hoặc tương tự. – RunLoop

+0

Điều gì sẽ xảy ra nếu thông báo đến từ Google cloud ??? getIntent() luôn trả về null trong trường hợp của tôi. – Josh

5

Mã hoạt động bắt đầu sẽ như thế này, nếu không sau khi nó đến từ thông báo GCM, từ đó mỗi lần Hoạt động đến từ danh sách Gần đây, nó sẽ đến từ thông báo GCM.

Intent intent = this.getIntent(); 
if (intent != null && intent.getExtras() != null && intent.getExtras().containsKey("JOBID") && (intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) { 
    int jobID = this.getIntent().getExtras().getInt("JOBID"); 

    if (jobID > 0) { 

    } 
} 
0

I Had cùng một vấn đề, và tôi không hiểu tại sao tôi phải sử dụng phương pháp putExtra ... Vì vậy, tôi giải quyết như thế này: khi bạn nhận được thông báo và bấm vào nó, ứng dụng này sẽ mở (thông thường nó sẽ mở hoạt động chính của ứng dụng) và, trong phần bổ sung, bạn có thể tìm thấy một số thông tin về thông báo đó. Bạn có thể thêm thông số khóa/giá trị vào thông báo bạn đang gửi tới thiết bị đã đăng ký. Các thông số này sẽ được thêm vào mục đích bổ sung.

Vì vậy, bạn có thể hành động như thế này: trong thông báo của bạn, thêm thông số đại diện cho id thông báo của bạn. Đối với esample "messageId" -> "abc", trong đó abc là mã nhận dạng thông báo của bạn.

Sau đó, trong hoạt động chính của bạn, bạn có thể làm:

if (getIntent().getExtras().keySet().contains("messageId")) { 
    // you opened the app from a notification 
    String messageId = getIntent().getStringExtra("messageId") 
    // do domething... 
} else { 
    // you opened the app normally 
    // do domething... 
} 

Và bạn sẽ lấy id của thông báo. Vì vậy, bạn có thể sử dụng thông tin này để, ví dụ, nhận thông báo từ db của bạn hoặc các hoạt động khác.