7

सबसे अच्छा तरीका है मैं मेरी समस्या का वर्णन कर सकते इस तरह है:अधिसूचना गतिविधि खुलती है, वापस बटन दबाया जाता है, मुख्य गतिविधि खोला जाता है?

  1. एक अधिसूचना (एक BroadcastReceiver के साथ) बूट पर बनाया जाता है।
  2. मेरा ऐप मुख्य गतिविधि खोला गया है और होम बटन दबाया गया है (ऐप तब भी पृष्ठभूमि में चल रहा है जब तक कि सिस्टम इसे बंद नहीं करता)।
  3. मैं स्टेटस बार खींचता हूं और बूट पर पहले बनाई गई अधिसूचना पर दबाता हूं।
  4. कुछ गतिविधि, मुख्य से अलग, शुरू की गई है।
  5. मैं बैक बटन दबाता हूं और मुख्य गतिविधि प्रदर्शित होती है।

मैं उस अंतिम चरण को कैसे रोक सकता हूं? बैक बटन के साथ मैं जो चाहता हूं वह वापस जाना है जहां मैं था, होम स्क्रीन (सभी विजेट्स और ऐप आइकन वाला डेस्कटॉप) है। मेरी ऐप की मुख्य गतिविधि पृष्ठभूमि पर चल रही थी, इसे बैक बटन के साथ क्यों कहा जाता था?

मामले में यह प्रासंगिक है, एक अधिसूचना बनाने के लिए मेरे कोड इस प्रकार है:

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

मैं intent के लिए और अधिक झंडे संयोजनों की एक जोड़ी जोड़ने की कोशिश की, लेकिन उनमें से न तो मेरी समस्या हल ... सुझाव?

उत्तर

3

आपकी समस्या निम्न चरणों में है के रूप में मैं जानता हूँ कि से अपने सवाल यह है कि

1. बनाएँ अधिसूचना के बाद बूट पूरा

2. मुख्य गतिविधि पर दबाया घर

3.you शुरू कॉल करेंगे बटन इसलिए मुख्य गतिविधि बंद कर दी जाएगी लेकिन

4. आप स्टेटस बार से अधिसूचना पर क्लिक करें ताकि आपके application will be resume ताकि आपके पहले से ही आपकी पिछली स्टैक में मुख्य गतिविधि हो और अधिसूचना तैयार हो आप की तरह ई नई गतिविधि अपने प्रश्न NewNoteActivity गतिविधि में वर्णित इस कदम you have two activities in back stack

5.you पर stack.SO पीठ पर धक्का होगा वापस दबाया बटन ताकि last activity will be destroy और अपने main activity will be resume लेकिन आप मुखपृष्ठ स्क्रीन पर जाने के लिए चाहते हैं।

तो आपकी समस्या के रूप में मैं अपने प्रश्न से पता निम्न चरणों में है

1. बनाएँ अधिसूचना के बाद बूट पूरा

2. मुख्य गतिविधि पर

3.you शुरू कॉल करेंगे दबाए गए होम बटन को तो मुख्य गतिविधि बंद कर दी जाएगी लेकिन

4. आप स्टेटस बार से अधिसूचना पर क्लिक करें ताकि आपके application will be resume ताकि आपके पास पहले से ही आपकी पिछली स्टैक और अधिसूचना में मुख्य गतिविधि हो आपके प्रश्न में उल्लिखित नई गतिविधि तैयार की जाएगी नई नोटएक्टिविटी गतिविधि बैक स्टैक पर धक्का दी जाएगी। इस चरण में you have two activities in back stack

5।आपने बैक बटन दबाया ताकि last activity will be destroy और आपके main activity will be resume पर जाएं, लेकिन जब आप न्यूनोट एक्टिविटी गतिविधि से बैक बटन दबाते हैं तो आप होमपेज गतिविधि खोलना चाहते हैं।

तो समाधान कि जब आप अपने NewNoteActivityactivity से बटन वापस दबाया आप Intent.FLAG_ACTIVITY_CLEAR_TOP ध्वज के साथ फिर से मुख्य गतिविधि प्रारंभ करें ताकि आपके मुख्य गतिविधि को पुन: होगा और इसलिए वहाँ onNewIntent() विधि प्राप्त होगा आप ध्वज प्राप्त कर सकते हैं और आप मुख्य गतिविधि

समाप्त कर सकते हैं है

उदाहरण

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

अब आप अपने मुख्य गतिविधि में onNewIntent() विधि को लागू करने के लिए है के लिए

न्यूनोट एक्टिविटी गतिविधि से दबाए गए बैक बटन पर आपकी मुख्य गतिविधि onNewIntent() विधि को कॉल करेगी, इसलिए इस विधि में आपको फ्लैग वेरिएबल लाने की ज़रूरत है जो न्यूनोट एक्टिविटी गतिविधि से गुजरती है। अगर आपको ध्वज मिलता है और यदि यह सत्य है तो बस मुख्य गतिविधि को समाप्त करें ताकि आपको होम स्क्रीन मिलेगी।

संपादित

आप कह रहे हैं आप ए, बी, या सी से गतिविधि के किसी भी है कि खोला जाता है और आप बटन वापस दबाया ताकि इस गतिविधि closed.If हो जाएगा आप में केवल एक ही गतिविधि है उस समय ढेर आपका आवेदन बंद हो जाएगा, इसका मतलब है कि आपको होम स्क्रीन मिल जाएगी। लेकिन अगर आपके पास एक से अधिक गतिविधियां हैं और आपने बैक बटन दबाया है तो आपके पास स्टैक में कम से कम एक गतिविधि है और अब आप अधिसूचना पर क्लिक करें ताकि यह एक नया खुल जाएगा आपकी अधिसूचना से जुड़ी गतिविधि ताकि इस गतिविधि को उस पर वापस स्टैक पर धकेल दिया जाएगा.अब यदि आप वापस बटन दबाते हैं तो आपकी पिछली गतिविधि जो आपकी अधिसूचना से जुड़ी हुई है, बंद हो जाएगी यदि आपने उस एक्टि में बैकप्रेस() विधि को संशोधित नहीं किया है vity और फिर बैक स्टैक में कोई गतिविधि होने पर यह वापस स्टैक की जांच करेगा ताकि गतिविधि फिर से शुरू हो जाएगी या यदि बैक स्टैक में कोई गतिविधि नहीं है तो आपका एप्लिकेशन बंद हो जाएगा और आपको होम स्क्रीन

+0

लगभग ... बात यह है कि मेरे पास होमपेज गतिविधि नहीं है, आपने मुझे गलत समझा। मेरा मतलब था कि मैं होम स्क्रीन, डेस्कटॉप पर वापस जाना चाहता था, जहां आपके पास वॉलपेपर के साथ आपके सभी विजेट हैं ... –

+0

मैंने अपना जवाब अब संपादित कर लिया था, आप इसे देख सकते हैं। – Dharmendra

+0

ऐसा लगता है कि यह काम कर सकता है लेकिन यह एक गंदे हैक की तरह दिखता है। आपने जो कुछ कहा वह समझ में आता है लेकिन मैं इस तरह के समाधान से खुश नहीं हूं और मैं इसका उपयोग नहीं कर रहा हूं। लेकिन मेरा मानना ​​है कि यह काम करता है और समस्या हल करता है, इसलिए मैं इसे स्वीकार्य उत्तर के रूप में चिह्नित कर रहा हूं। –

3

एक ही समस्या थी। क्या मेरे लिए काम किया प्रकट में स्थापित करने गया था गतिविधि अधिसूचना द्वारा शुरू करने के लिए निम्न विशेषता:

android:taskAffinity=""

यह अनिवार्य रूप से मुख्य गतिविधि से अधिसूचना गतिविधि के संबंध को अलग करती है और इसलिए ओएस नहीं है मुख्य गतिविधि में "वापसी" की आवश्यकता महसूस करें, लेकिन उदाहरण से पहले जो कुछ भी वहां था, वह वापस लौटता है "डेस्कटॉप"।

+0

यह नहीं जानता कि इसका क्या अर्थ है लेकिन यह पूरी तरह से काम करता है – yasiriqbal776

19

जिनके लिए अभी भी उत्तर की आवश्यकता हो सकती है। ऐसा लगता है कि आप यही हासिल करना चाहते हैं:

जब आप अधिसूचना से Activity प्रारंभ करते हैं, तो आपको उपयोगकर्ता के अपेक्षित नेविगेशन अनुभव को सुरक्षित रखना होगा। पर क्लिक करने से उपयोगकर्ता को होम स्क्रीन पर एप्लिकेशन के सामान्य कार्य प्रवाह के माध्यम से वापस ले जाना चाहिए, और रिकेंट्स पर क्लिक करना गतिविधि को एक अलग कार्य के रूप में दिखाना चाहिए।

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

आपका स्थिति है - Setting up a regular activity PendingIntent

कड़ी में पूर्ण चरण देखें।मूल रूप से आप की जरूरत है:
1. में Activity पदानुक्रम परिभाषित 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. बनाएँ वापस ढेरIntent के आधार पर कि 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

यह सबसे अच्छा जवाब –

+0

है जब मैंने अधिसूचना पर क्लिक किया और गतिविधि खोल दी और मेरी होम स्क्रीन पर जाकर एक समस्या का सामना किया और फिर कुछ सेकंड बाद मैं एक नई अधिसूचना भेजता हूं। अब एक अधिसूचना फिर से प्राप्त नहीं होगी। उपरोक्त कोड का उपयोग करने में मेरी मदद करता है। धन्यवाद! – natsumiyu

0

यह मेरे लिए काम करता है। इसे आजमाएं:

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

मैं अपने ऐप्स में इस समाधान का उपयोग करता हूं। बैकप्रेस पर ओवरराइड करें (आपकी गतिविधि में अधिसूचना से रूका गया) और जांचें कि आपका ऐप ढेर में है या नहीं। यदि नहीं तो अपनी रूट गतिविधि शुरू करें। उपयोगकर्ता हमेशा आपकी मूल गतिविधि से नेविगेट कर सकता है। मैं अपने ऐप्स में यह करता हूं

@Override 
public void onBackPressed() { 
    if (isTaskRoot()) { 
     Intent intent = new Intent(this,YourMainActivity.class); 
     startActivity(intent); 
     super.onBackPressed(); 
    }else { 
     super.onBackPressed(); 
    } 
}