2011-07-21 17 views
10

vs Birkaç Android uygulamaları yazdım ve her zaman olduğu gibi bir başlangıç ​​Activity ilan ettiler:Android Uygulama Etkinliği

<intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 

O eğer ben vb bazı küresel yöntemler, statik, paylaşılan tercihleri ​​kapsam için çok iyi olur benim app Application kullanarak o zamanilk Activity çağırır sonra prefs, vb ayarlandıktan sonra başlayabilirsiniz, ama bu tasarım deseni herhangi bir örnek bulamadım ... bu kodu denediğinizde, ben ClassCastException:

public class MyApplication extends Application { 
@Override 
    public void onCreate() { 
     super.onCreate(); 

     // do stuff (prefs, etc) 

     // start the initial Activity 
     Intent i = new Intent(this, InitialActivity.class); 
    startActivity(i); 
    } 
} 

InitialActivity.class, MAIN olarak ayarlanmış, ancak MAIN bildirilen MyApplication bildirmeye çalışıyorsa, iyi çalışıyor, Activity gerçekten hatayı üretir. Muhtemelen çok aptalca bir soru, ama bunu yanlış anladım mı?

sayesinde

Paul

+3

yapın Uygulamamı bir Etkinlik olarak mı tanımlarsınız? Bu, bir ClassCastException neden olur. Mutlak Android, yapmak istediğiniz şeyi doğru anlarsam, yapmak istediğiniz şeyi sizin için zaten yapar. Uygulamanızın adını, bu yol ve Uygulamamın adına ayarlamanız yeterlidir. Faaliyetlerinizden önce oluşturulacak ve hepsine açık olacak. Bunun gibi:

+0

İlginç - daha sonra uygulamalardan özel uygulamalara nasıl erişirim? –

+1

Etkinliğinizden, bu nedenle Uygulamaya ilişkin bir tanıtıcı alabilirsiniz: getApplicationContext(), bunun sonucunda, manifestinizde yukarıdaki gibi yapılandırılmışsa, Uygulamamıza yayınlanır. –

cevap

19

Sen FLAG_ACTIVITY_NEW_TASK bayrağını kullanarak bu düzeltebilirsiniz:

Eğer Etkinlik Etkinlik bağlamı dışında başlatılır yeni görev başlamak gerekir çünkü var
Intent intent = new Intent(this, ApplicationActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent); 

. Ancak, Etkinliğinizi uygulamanızın onCreate() numaralı telefonundan başlatmamanızı tavsiye ederim.


Android'in 4 bileşenleri vardır: Activity, Service, ContentProvider and Broadcast.

Android'in bu bileşenlerden birini uygulamanızdan etkinleştirmesi gerektiğinde, uygulamanızla halihazırda var olan bir işlem olup olmadığına bakar. Değilse, Android yeni bir işlem başlatır, başlatır, ardından özel Uygulama örneğinizi başlatır. Ve sonra gerekli bileşenlerden birini etkinleştirir.

Şimdi, bir sonraki senaryoyu ele alalım: uygulamanız, AndroidManifest.xml numaralı telefonunda içerik sağlayıcısı ilan etti ve Android, uygulamanızı başlatmak üzere hemen hemen başka bir ön plan uygulamasına bazı veriler sağlayabilmeniz için.

  1. İçerik Sağlayıcı isteği Başvurunuz çalıştıran değildi
  2. gönderilir ve Android bunun için yeni bir süreç başlar.
  3. Özel Uygulama örneğiniz
  4. Application.onCreate() olarak adlandırılmıştır.
  5. Sen
  6. Kişisel İçerik Sağlayıcı sadece içerik sağlayıcısına bağlanmak istedim ama uygulamanız yerine açtığı

Somebody talep alan bir faaliyet başlatırlar. Arka plan Servisi ve bazen de alıcıları yayınlamak için de geçerlidir.

Ayrıca, başka bir uygulamanın etkinliği A uygulamanızın X etkinliğini başlatmak istediğini de düşünün. Ancak onCreate()'da Y aktivitesini başlattınız ve X de Android tarafından başlatıldı. Sonra kullanıcı geri basar. Ne olmalı? Application 'onCreate' den başlayan aktiviteler oldukça tuhaf kullanıcı tecrübesi ile sonuçlanabilir. Öyleyse yapma.


GÜNCELLEME: Android Uygulama yalnızca bir kez oluşturulur ve başka bir bileşen önce, kendi Uygulamanın tek örneği erişmek için bir sonraki kodu kullanabilirsiniz garanti Çünkü: bunu demek

public class MyApplication extends Application 
{ 
    private static MyApplication s_instance; 

    public MyApplication() 
    { 
     s_instance = this; 
    } 

    public static MyApplication getApplication() 
    { 
     return s_instance; 
    } 
} 
+0

Mükemmel, teşekkürler. Bu nedenle, 'Etkinliğin' geri kalanına maruz kalacağım, Uygulamamda özel yöntemler bildirme açısından, bu mümkün mü? Onlara nasıl erişirim ('getApplication()' hile yapmaz) –

+0

Cevabı güncelledim. – inazaruk

+0

Bu yüzden, Uygulamamda erişmeyi istediğim tüm yöntemlere MyApplication.getApplication() aracılığıyla erişilebiliyor. MyMethod()? –

0

senin içinde bu niyet için apaçık etkinlik etiketi ayarladınız mı sen (ana yanı sıra başka bir) başlıyor?

</activity> 
      <activity android:name=".InitialActivity"       
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="com.package.INITACT" /> <--- this is only name by which you activity can be called. 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
İlgili konular