7

Cách tốt nhất tôi có thể mô tả vấn đề của tôi là như thế này:Thông báo mở hoạt động, nhấn nút quay lại, hoạt động chính được mở?

  1. Một thông báo được tạo ra lúc khởi động (với một BroadcastReceiver).
  2. Hoạt động chính của ứng dụng của tôi được mở và nút trang chủ được nhấn (ứng dụng vẫn chạy trong nền cho đến khi hệ thống đóng ứng dụng).
  3. Tôi kéo thanh trạng thái xuống và nhấn vào thông báo được tạo trước đó khi khởi động.
  4. Một số hoạt động, khác với hoạt động chính, được bắt đầu.
  5. Tôi nhấn nút quay lại và hoạt động chính được hiển thị.

Làm cách nào để ngăn chặn bước cuối cùng? Những gì tôi muốn với nút quay lại là để quay trở lại nơi tôi đã được, đó là màn hình chủ (máy tính để bàn với tất cả các widget và các biểu tượng ứng dụng). Hoạt động chính của ứng dụng của tôi được cho là chạy trên nền, tại sao nó được gọi bằng nút quay lại?

Trong trường hợp nó có liên quan, mã của tôi để tạo ra một thông báo đi như thế này:

public void createNotification(int notifyId, int iconId, String contentTitle, String contentText) { 
    Intent intent = new Intent(mContext, NewNoteActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    intent.putExtra(AgendaNotesAdapter.KEY_ROW_ID, (long)notifyId); 

    PendingIntent contentIntent = PendingIntent.getActivity(mContext, notifyId, intent, 0); 

    Notification notification = new Notification(iconId, contentTitle, 0); 
    notification.setLatestEventInfo(mContext, contentTitle, contentText, contentIntent); 

    mNotificationManager.notify(notifyId, notification); 

Tôi cố gắng thêm một vài nhiều cờ kết hợp để intent nhưng cả hai đều không giải quyết vấn đề của tôi ... Gợi ý?

Trả lời

3

Vấn đề của bạn là ở bước sau như tôi biết từ câu hỏi của bạn là

1.Create thông báo sau khi khởi động hoàn chỉnh hoạt động

2.Main sẽ kêu gọi khởi động

3.you ép nhà nút để hoạt động chính sẽ bị ngừng nhưng sẽ không hủy

4.Bạn nhấp vào thông báo từ thanh trạng thái để application will be resume để bạn có hoạt động chính trong ngăn xếp và thông báo sẽ tạo e hoạt động mới như bạn đề cập trong hoạt động NewNoteActivity câu hỏi của bạn sẽ được đẩy lên lưng stack.SO tại bước này you have two activities in back stack

5.you ép lại nút để last activity will be destroymain activity will be resume của bạn Nhưng bạn muốn đi vào màn hình trang chủ.

Vì vậy, vấn đề của bạn là ở bước sau như tôi biết từ câu hỏi của bạn

1.Create thông báo sau khi khởi động hoàn chỉnh hoạt động

2.Main sẽ kêu gọi khởi động

3.you nhấn nút home để hoạt động chính sẽ bị dừng nhưng sẽ không hủy

4.Bạn nhấp vào thông báo từ thanh trạng thái để application will be resume để bạn có hoạt động chính trong ngăn xếp lưng và thông báo wi ll tạo hoạt động mới như bạn đã đề cập trong câu hỏi của bạn Hoạt động NewNoteActivity sẽ được đẩy vào ngăn xếp lại.SO tại bước này you have two activities in back stack

5.bạn nhấn nút quay lại để last activity will be destroymain activity will be resume Nhưng bạn muốn mở hoạt động trang chủ khi bạn nhấn vào nút quay lại từ hoạt động NewNoteActivity.

Vì vậy, giải pháp là khi bạn nhấn nút Back từ NewNoteActivityactivity của bạn, bạn bắt đầu hoạt động chính một lần nữa với Intent.FLAG_ACTIVITY_CLEAR_TOP cờ để hoạt động chính của bạn sẽ tái tạo và sẽ nhận onNewIntent() phương pháp do đó bạn có thể nhận cờ và bạn có thể hoàn hoạt động chính

ví dụ

@Override 
    public void onBackPressed() { 
     Intent i = new Intent(this, Main.class); 
    i.putExtra("exit", true); 
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(i); 
    super.onBackPressed(); 
    } 

Bây giờ bạn cần phải thực hiện onNewIntent() phương pháp trong hoạt động chính của bạn

Trên nút quay được nhấn từ hoạt động NewNoteActivity, hoạt động chính của bạn sẽ gọi phương thức onNewIntent() vì vậy trong phương pháp này, bạn phải tìm nạp biến cờ được chuyển từ hoạt động NewNoteActivity.Nếu bạn có cờ và nếu đúng thì chỉ cần hoàn thành hoạt động chính để bạn sẽ nhận được Màn hình chính.

EDIT

Bạn đang nói rằng bạn có bất kỳ hoạt động từ A, B, hoặc C được mở ra và bạn nhấn lại nút để hoạt động này sẽ được closed.If bạn chỉ có một hoạt động trong ngăn xếp tại thời điểm đó ứng dụng của bạn sẽ bị đóng có nghĩa là bạn sẽ nhận được màn hình chính.Nhưng nếu bạn có nhiều hoạt động và bạn nhấn nút quay lại, bạn có ít nhất một hoạt động trong ngăn xếp và bây giờ bạn nhấp vào thông báo để điều này sẽ mở một hoạt động được liên kết với thông báo của bạn để hoạt động này được đẩy lên trên ngăn xếp lại.Now nếu bạn nhấn nút quay lại, hoạt động cuối cùng được liên kết với thông báo của bạn sẽ bị đóng nếu bạn không sửa đổi phương thức onBackPressed() trong acti đó vity và sau đó nó sẽ kiểm tra lại stack nếu bất kỳ hoạt động trong ngăn xếp trở lại để hoạt động sẽ được tiếp tục hoặc nếu không có hoạt động trong ngăn xếp trở lại sau đó ứng dụng của bạn sẽ được đóng lại và bạn sẽ nhận được màn hình chính

+0

Hầu như ... Điều này là, tôi không có hoạt động trên trang chủ, bạn hiểu lầm tôi. Điều tôi muốn nói là tôi muốn quay lại màn hình chính, màn hình nền, nơi bạn có tất cả các tiện ích với hình nền ... –

+0

Tôi đã chỉnh sửa câu trả lời ngay bây giờ, bạn có thể kiểm tra nó. – Dharmendra

+0

Điều đó có vẻ như nó có thể làm việc nhưng nó cũng trông giống như một hack bẩn. Tất cả những gì bạn nói đều có ý nghĩa nhưng tôi không hài lòng với giải pháp đó và tôi sẽ không sử dụng nó. Nhưng tôi tin rằng nó hoạt động và giải quyết vấn đề, vì vậy tôi đánh dấu nó là câu trả lời được chấp nhận. –

3

Có cùng một vấn đề. gì làm việc cho tôi được thiết lập trong biểu hiện thuộc tính sau đây để hoạt động đưa ra bởi các thông báo:

android:taskAffinity=""

này về cơ bản tách ái lực của hoạt động thông báo từ các hoạt động chính và do đó hệ điều hành không cảm thấy cần phải "quay trở lại" để hoạt động chính, nhưng chỉ đơn giản là quay trở lại bất cứ điều gì đã có trước khi ví dụ Máy tính để bàn".

+0

không biết ý nghĩa của nó là gì nhưng nó hoạt động hoàn hảo – yasiriqbal776

19

Đối với những người vẫn có thể cần câu trả lời. Có vẻ như đây là những gì bạn muốn đạt được:

Khi bạn bắt đầu một Activity từ thông báo, bạn phải duy trì trải nghiệm điều hướng mong đợi của người dùng. Nhấp vào Quay lại sẽ đưa người dùng trở lại luồng công việc bình thường của ứng dụng đến Màn hình chính và nhấp vào Cuộc gọi gần đây sẽ hiển thị Hoạt động dưới dạng tác vụ riêng biệt.

http://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse

tình hình của bạn là - Setting up a regular activity PendingIntent

Xem các bước đầy đủ trong liên kết.Về cơ bản bạn cần phải:
1. Xác định Activity hệ thống cấp bậc trong AndroidManifest.xml

<activity 
    android:name=".MainActivity" 
    android:label="@string/app_name" > 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 
<activity 
    android:name=".ResultActivity" 
    android:parentActivityName=".MainActivity"> 
    <meta-data 
     android:name="android.support.PARENT_ACTIVITY" 
     android:value=".MainActivity"/> 
</activity> 


2. Tạo một lại đống dựa trên Intent rằng bắt đầu Activity:

... 
Intent resultIntent = new Intent(this, ResultActivity.class); 
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
// Adds the back stack 
stackBuilder.addParentStack(ResultActivity.class); 
// Adds the Intent to the top of the stack 
stackBuilder.addNextIntent(resultIntent); 
// Gets a PendingIntent containing the entire back stack 
PendingIntent resultPendingIntent = 
     stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
... 
NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 
builder.setContentIntent(resultPendingIntent); 
NotificationManager mNotificationManager = 
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
mNotificationManager.notify(id, builder.build()); 
+0

đây là câu trả lời hay nhất –

+0

Tôi gặp phải sự cố khi tôi nhấp vào thông báo và mở hoạt động và chuyển đến màn hình chính và sau vài giây tôi gửi thông báo mới sẽ không còn nhận được thông báo nữa. Sử dụng mã trên giúp tôi. Cảm ơn! – natsumiyu

0

Nó phù hợp với tôi. hãy thử điều này:

notifyIntent.setAction(Intent.ACTION_MAIN); 
notifyIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
1

Tôi sử dụng giải pháp này trong ứng dụng của mình. Ghi đè trênBackPressed (trong hoạt động của bạn được định tuyến từ thông báo) và kiểm tra xem ứng dụng của bạn có đang ở trong ngăn xếp hay không. nếu không thì bắt đầu hoạt động gốc của bạn. Người dùng luôn có thể điều hướng từ hoạt động gốc của bạn. Đây là những gì tôi làm trong các ứng dụng của tôi

@Override 
public void onBackPressed() { 
    if (isTaskRoot()) { 
     Intent intent = new Intent(this,YourMainActivity.class); 
     startActivity(intent); 
     super.onBackPressed(); 
    }else { 
     super.onBackPressed(); 
    } 
} 
Các vấn đề liên quan