2012-05-27 21 views
6

मैं सी 2 डीएम का उपयोग कर रहा हूं, मेरे ब्रॉडकास्ट रिसीवर सी 2 डीएम घटनाओं को स्थानीय सेवा में प्रचारित करते हैं। सेवा मेरे वेबसर्वर पर आईडी भेजकर पंजीकरण को पूरा करती है, यह डिवाइस को नए संदेशों के बारे में जानकारी देने के लिए ज़िम्मेदार है, हालांकि यदि आवेदन (गतिविधियों में से एक) ऊपर है तो हम उस डेटा को नए डेटा के साथ एक इरादा भेजना चाहते हैं यह अद्यतन किया जा सकता है, अगर अधिसूचना प्रबंधक से उपयोगकर्ता को सूचित करने के लिए उपयोग नहीं किया जाता है।यह पता लगाना कि एंड्रॉइड गतिविधि चल रही है

मुद्दा यह है कि गतिविधि को कैसे चलाना है? एप्लिकेशन ऑब्जेक्ट एक विकल्प नहीं है क्योंकि सेवा उस एप्लिकेशन का हिस्सा है जो स्पष्ट रूप से मौजूद होने जा रही है। प्रत्येक एप्लिकेशन के ऑनस्रॉय में अपंजीकृत भी एक विकल्प नहीं है क्योंकि यह अभिविन्यास परिवर्तन में हो सकता है ...

इसे करने के लिए कोई मानक तरीका है?

उत्तर

17

समाधान 1: आप जाँच हो रही है के लिए उपयोग कर सकते हैं ActivityManager गतिविधि या चल रहा है नहीं: अपने प्रकट करने की अनुमति जोड़ने के लिए

public boolean isActivityRunning() { 

ActivityManager activityManager = (ActivityManager)Monitor.this.getSystemService (Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> activitys = activityManager.getRunningTasks(Integer.MAX_VALUE); 
    isActivityFound = false; 
    for (int i = 0; i < activitys.size(); i++) { 
     if (activitys.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.example.testapp/com.example.testapp.Your_Activity_Name}")) { 
      isActivityFound = true; 
     } 
    } 
    return isActivityFound; 
} 

जरूरत ..

<uses-permission android:name="android.permission.GET_TASKS"/> 

समाधान 2 : आप अपनी गतिविधि में एक स्थैतिक चर का उपयोग कर सकते हैं जिसके लिए आप इसे देखना चाहते हैं या नहीं और इसे स्टोर करना चाहते हैं के रूप में आपकी सेवा से पहुँच या प्रसारण रिसीवर के लिए कुछ जहाँ: मुझे आशा है कि

static boolean CurrentlyRunning= false; 
     public void onStart() { 
     CurrentlyRunning= true; //Store status of Activity somewhere like in shared //preference 
     } 
     public void onStop() { 
     CurrentlyRunning= false;//Store status of Activity somewhere like in shared //preference 
     } 

यह सहायक था!

+0

पहली विधि घुसपैठ कर रही है, लेकिन मैं जानना चाहता हूं कि कोई गतिविधि चल रही है या नहीं, जैसे कि मेरा एप्लिकेशन चल रहा है (सेवा को छोड़कर) स्थैतिक विधि अच्छा नहीं है क्योंकि गतिविधि में एक से अधिक उदाहरण हो सकते हैं शायद एक आवेदन mutex होगा चाल करें ... – codeScriber

+0

मैं गलत हो सकता हूं लेकिन मुझे लगता है कि यह केवल एक कार्य में वर्तमान शीर्ष गतिविधि की जांच करता है। यदि हां, तो एक ही कार्य में अन्य गतिविधियों (रोका या बंद) के बारे में क्या? –

+7

पहली विधि का उपयोग न करें। ActivityManager दस्तावेज़ से: "नोट: यह विधि केवल कार्य प्रबंधन उपयोगकर्ता इंटरफेस को डिबगिंग और प्रस्तुत करने के लिए है। इसका उपयोग किसी एप्लिकेशन में कोर लॉजिक के लिए कभी नहीं किया जाना चाहिए, जैसे यहां प्राप्त जानकारी के आधार पर विभिन्न व्यवहारों के बीच निर्णय लेना।" – yarian

-1

here से कॉपी किया गया।

आप गतिविधि के भीतर एक स्थिर चर का उपयोग कर सकते हैं।

class MyActivity extends Activity { 
    static boolean active = false; 

     public void onStart() { 
     active = true; 
     } 

     public void onStop() { 
     active = false; 
     } 
} 
+0

यदि आप किसी अन्य प्रश्न और उसके उत्तरों में एकदम सही मिलान ढूंढें, आपको यहां जवाब नहीं देना चाहिए, लेकिन इस सवाल को डुप्लिकेट के रूप में चिह्नित करें ... –

4

अगले दृष्टिकोण अच्छी तरह से काम करेगा आप आने Google मेघ संदेश सेवा (C2DM) अपनी गतिविधि से संभाल (यदि हो तो चल रहा है) या एक अधिसूचना जारी करता है, तो कोई गतिविधियों चल रहे हैं करना चाहते हैं।

मैनिफेस्ट फ़ाइल में एक ब्रॉडकास्ट रिसीवर पंजीकृत करें। जब भी एप्लिकेशन नहीं चल रहा है तो यह रिसीवर सी 2 डी संदेशों को संभालेगा। अपनी गतिविधि में प्रोग्रामेटिक रूप से एक और ब्रॉडकास्ट रिसीवर पंजीकृत करें। जब भी गतिविधि चल रही है तो यह रिसीवर सी 2 डी संदेशों को संभालेगा।

AndoroidManifest.xml

<receiver 
    android:name=".StaticReceiver" 
    android:permission="com.google.android.c2dm.permission.SEND" > 
    <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     <category android:name="com.mypackage" /> 
    </intent-filter> 
</receiver> 

MyReceiver.java

public class StaticReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Trigger a Notification 
    } 
} 

MyActivity.java

public class MyActivity extends ActionBarActivity { 

    @Override 
    protected void onResume() { 
    super.onResume(); 

     final IntentFilter filter = new 
       IntentFilter("com.google.android.c2dm.intent.RECEIVE"); 
     filter.addCategory("com.mypackage"); 
     filter.setPriority(1); 
     registerReceiver(dynamicReceiver, filter, 
       "com.google.android.c2dm.permission.SEND", null); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     unregisterReceiver(dynamicReceiver); 
    } 

    private final BroadcastReceiver dynamicReceiver 
      = new BroadcastReceiver() 
    { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      // TODO Handle C2DM 

      // blocks passing broadcast to StaticReceiver instance 
      abortBroadcast(); 
     } 
    }; 
} 

नोट! पहले प्रसारण को पकड़ने के लिए, डायनामिक रिसीवर इंटेंटफिल्टर की प्राथमिकता स्टेटिक रिसीवर इंस्टेंस इंटेंटफिल्टर की प्राथमिकता से अधिक होनी चाहिए (डिफ़ॉल्ट प्राथमिकता '0' है)।

पीएस। ऐसा लगता है कि Google क्लाउड मैसेजिंग सेवा द्वारा जारी किए गए प्रसारण ब्रॉडकास्ट का आदेश दिया गया है।मूल विचार लेखक: CommonsWare

1

सबसे आसान तरीका है कि एक गतिविधि या चल रहे हैं या नहीं की जाँच करने के:

Context context = MyActivity.this; 

if (! ((Activity) context).isFinishing()) { 
    // Activity is running 
} else { 
    // Activity has been finished 
} 

नोट: यदि गतिविधि नहीं चल रहा है तो आप किसी भी यूआई संबंधित कार्रवाई नहीं करना चाहिए।

संबंधित मुद्दे