2010-10-03 22 views
28

I (OnPause uygulanan aşağıdaki BroadcastReceiver) yöntemi kullanılarak şarj benim nightclock uygulamasını başlatmamk çalışıyorum den:startActivity() BroadcastReceiver

USB kablosu
BroadcastReceiver test = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     unregisterReceiver(this); 
     Intent i = new Intent(context, NightClock.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 
    }   
}; 
registerReceiver(test, new IntentFilter(Intent.ACTION_POWER_CONNECTED)); 

OnReceive() yöntemi tetiklenir olduğunu takılı, ancak etkinlik başlamıyor. Günlük bunu gösterir Ancak:

I/ActivityManager( 79): Starting activity: Intent { flg=0x10000000 cmp=com.meins.nightclock/.NightClock } 

günlük aktivite başlatılır, ancak hiçbir şey olmuyor diyor neden Herhangi fikirler?

+0

Lütfen sorununuzu LogCat'tan daha fazla güncelleyin - bundan önce birkaç satır ve bundan sonra bir düzine kadar çizgi. Ayrıca, neden FLAG_ACTIVITY_NEW_TASK'? Ayrıca, ACTION_POWER_CONNECTED gerçekleştiğinde bu 'BroadcastReceiver' kaydını hala devam ettiren etkinlik nedir? – CommonsWare

+0

Güç kaynağına bağlanırken LogCat'ta başka satır yok. 'BroadcastReceiver', başlatması gereken aynı aktivitede kayıtlı. Bu etkinlik hala arka planda çalışıyor (LogCat uygulaması öne getirildi). Bu etkinlik görev yöneticisi tarafından öldürülürse, 'BroadcastReceiver' hiç tetiklemiyor gibi görünmektedir. Uygulamamın baştan başlayarak otomatik olarak başlatılmasına yönelik bu yaklaşım mı? – Gubbel

cevap

16

Hedefiniz, ACTION_POWER_CONNECTED yayını gönderildiğinde, NightClock numaralı telefonun yayınlanmasını istiyorsanız, BroadcastReceiver numaralı telefonu kullanmaya yaklaşımınız iyi. Ancak, bunu bir etkinlikten kaydetmeyin. Aksine, manifest'te kaydetmek:

<receiver android:name=".OnPowerReceiver"> 
     <intent-filter> 
       <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> 
     </intent-filter> 
</receiver> 

Sonra var senin BroadcastReceiver bir kamu Java (ne istersen arayabilirsin gerçi burada, OnPowerReceiver adlandırılır) sınıfına ve startActivity() çağrı gibi.

Kullanıcıların bunu yapmak istemediğini unutmayın. Bir telefonu "gece saati" başlatmanın yanı sıra güce bağlamak için başka birçok durum vardır. Alçakgönüllülükle, kullanıcıların ana ekran üzerinden faaliyetlerinizi başlatmasına izin vermenizi öneriyorum.

+0

'BroadcastReceiver', 'onReceive()' yönteminde bu çağrıyla yaptığınız gibi manifestoda kayıt oldum: context.startActivity (yeni Intent (context, NightClock.class)); 'Ama bağlandığımda hiçbir şey olmuyor Telefon açılacak 'Log.d (this.toString(),' uygulamayı başlatmaya çalışıyorum ... ');' metoduna eklediğimde, bir günlük girişi bile eklenmez. – Gubbel

+2

@Gubbel: Oops. 'ı deneyin. Çoğu zaman, dizede "ACTION_" harfi yoktur, ancak görünüşe göre bunu yaparlar. – CommonsWare

+0

Çalışıyor! Teşekkür ederim. Uygulama görev listesinden kaldırılırsa – Gubbel

46

yüzden sadece kullanın() metodu onRecieve için parametre olarak geçirilen bağlamı vardır:

@Override 
public void onReceive(Context context, Intent intent) { 
    //start activity 
    Intent i = new Intent(); 
    i.setClassName("com.test", "com.test.MainActivity"); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 
} 

Bu tabii kendi Paketi ve etkinlik sınıfı adını değiştirmek zorunda çalışır. Docs itibaren

+2

'yi ayarlamanız gerekiyor Neden downvote? Bu kötü mü? Kötü bir yaklaşım olduğunu söyleyen hiçbir şey bulamadığım için bana +1 yardımcı oldu. – Mafro34

+0

@ Mafro34 Sadece aynı yaklaşımı denedim ve ideal olmadığını düşündüğüm sebep, belirlediği bayrak. Çünkü ne istediğinizi bu değilse (yeni bir görev yürütürseniz), uygulama mantığınızla ciddi şekilde karışabilir - yine de benim yaptığım gibi. Yani istediğin şey bu değilse, başka bir yaklaşım bulmanı öneririm. – AgentKnopf

+5

@AgentKnopf Çok fazla seçeneğiniz yok gibi görünüyor: (http://developer.android.com/reference/android/content/Context.html#startActivity%28android.content.Intent%%20android.os.Bundle % 29): "Bu yöntemin bir Etkinlik Bağlamının dışından çağrılması durumunda, niyetin FLAG_ACTIVITY_NEW_TASK lansman bayrağını içermesi gerekir. Bunun nedeni, var olan bir Etkinlikten başlatılmadan, mevcut bir görev yoktur. yeni aktiviteyi yerleştirmek ve böylece kendi ayrı görevine yerleştirilmesi gerekiyor. ” – aberaud

-3

:

kullanıcı deneyimi sarsıcı çünkü

yayın alıcılarının gelen etkinliklerini başlamayın

; Özellikle birden fazla alıcı varsa. Bunun yerine, bir bildirim görüntülemeyi düşünün.

+0

Bunu alarmlar ve gelen çağrılar gibi birçok varsayılan uygulamada geçersiz kılarlar. Yani, kullanıcı bunun olmasını isterse, bu onun çağrıdır. Ve cevabınız soruyu cevaplamıyor. – Dpedrinha

İlgili konular