Mevcut etkinlikten çıkarsa kullanıcının ana ekrana dönüp dönmeyeceğini bilmek istiyorum.
Mevcut etkinlikten çıkarsa kullanıcının ana ekrana dönüp dönmeyeceğini bilmek istiyorum.
Yanıtlar:
GÜNCELLEME (Temmuz 2015):
Yana getRunningTasks () API 21 dan takip etmek daha iyidir, kullanımdan kaldırılan olsun raukodraug cevap veya Ed Burnette biri (ben ikincisini tercih ediyorum).
ActivityManager'ı
kullanarak mevcut görevleri ve yığınlarını kontrol etme imkanı vardır .
Bu nedenle, bir etkinliğin son etkinlik olup olmadığını belirlemek için:
Aşağıdaki kodu kullanın:
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);
if(taskList.get(0).numActivities == 1 &&
taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
Log.i(TAG, "This is last activity in the stack");
}
Yukarıdaki kodun yalnızca tek bir göreviniz varsa geçerli olacağını lütfen unutmayın. Uygulamanız için çok sayıda görevin bulunma olasılığı varsa - Diğer taskList öğelerini kontrol etmeniz gerekir . Görevler ve Back Stack hakkında daha fazla bilgi edinin
isTaskRoot()
Yöntemi kullanarak bunu doğru şekilde yapmalısınız .
@ H9kDroid'in yorumunu, benzer soruları olan insanlar için en iyi cevap olarak burada yayınlayacağım .
Etkinliğin bir görevin kökü olup olmadığını öğrenmek için isTaskRoot () kullanabilirsiniz .
Umarım bu yardımcı olur
if (isTaskRoot()) { // do something }
Umarım bu yeni başlayanlara yardımcı olur, Benim için iyi çalışan yukarıdaki cevaplara dayanarak, ayrıca kod pasajını paylaşıyorum, böylece uygulanması kolay olacak.
Çözüm: i kullanılan isTaskRoot()
geri dönme doğruysa eğer mevcut etkinlik yalnızca yığınında faaliyettir ve eğer ben de davayı ele dışındaki i yerine yeni açılması yığınında son aktiviteye yığın seferde bazı etkinlikler var özel bir.
Aktivitenizde
@Override
public void onBackPressed() {
if(isTaskRoot()){
startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
// using finish() is optional, use it if you do not want to keep currentActivity in stack
finish();
}else{
super.onBackPressed();
}
}
bunun için en kolay çözüm var, etkinliğinizde isTaskRoot () kullanabilirsiniz
Bunu başarmanın bir yolu olsa da (diğer cevaplara bakın) bunu yapmamanızı öneririm. Normal Android uygulamalarının Ana ekranın görüntülenip görüntülenmeyeceğini bilmesine gerek yoktur.
Verileri kaydetmeye çalışıyorsanız, veri kaydetme kodunu onPause () yönteminize yerleştirin. Kullanıcıya uygulamanın mevcut olmasıyla ilgili fikrini değiştirmesi için bir yol vermeye çalışıyorsanız, Geri tuşu ve onBackPressed () yöntemi için yukarı / aşağı tuşunu durdurabilir ve onlara "Emin misiniz?" Komut istemi.
Bunu takip etmenin bir yolu, yeni bir aktiviteye başladığınızda bir işaretçi eklemek ve işaretin var olup olmadığını kontrol etmektir.
Yeni bir aktiviteye başladığınız her seferde, işaretçiyi ekleyin:
newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);
Ve daha sonra şu şekilde kontrol edebilirsiniz:
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
Sandrstar'ın çözümünün kullanılmasıyla ilgili sorun ActivityManager
şudur: görevleri bu şekilde almak için bir izne ihtiyacınız var. Daha iyi bir yol buldum:
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
Activity
Diğer Etkinlikler alamadım gerekirken, Yığın altta daima varsayılan olarak bu kategoriyi almalısınız.
Ancak bu bazı cihazlarda başarısız olsa bile, aşağıdakileri başlatırken ayarlayabilirsiniz Activity
:
Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
Tüm etkinliklerim için AppCompatActivity'yi genişleten ve statik bir sayacı olan bir temel sınıf oluşturdum :
public abstract class BasicActivity extends AppCompatActivity {
private static int activityCounter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
++activityCounter;
...
}
@Override
public void onDestroy() {
super.onDestroy();
--activityCounter;
if(activityCounter==0) {
// Last instance code...
}
}
public boolean isLastInstance() { return (activityCounter==1); }
}
Bu şimdiye kadar yeterince iyi çalıştı; ve API sürümünden bağımsız olarak. Tabii ki, tüm faaliyetlerin bu temel sınıfı genişletmesini gerektirir - benim durumumda yaptıkları.
Düzenleme: Uygulama tamamen çıkmadan önce sayaç sıfıra düştüğünde, yön değiştirildiğinde ve yalnızca bir etkinliğin açık olduğu bir örnek fark ettim. Oryantasyon değiştiğinde, aktivite kapatılır ve bir başkası oluşturulur, bu nedenle onDestroyed
son aktivite onCreate
için çağrılır ve ardından aynı aktivite değiştirilen oryantasyon ile oluşturulduğunda çağrılır. Bu davranış hesaba katılmalıdır; OrientationEventListener muhtemelen kullanılabilir.
Android bir Etkinlik yığını uygular, bunun hakkında burada okumanızı öneririm . Bu is arama faaliyeti almak olsa yapmak istediğim gibi tüm görünür: getCallingActivity()
. Geçerli etkinlik uygulamanızdaki ilk etkinlikse ve uygulama ana ekrandan başlatıldıysa geri dönmelidir (sanırım) null
.
Burada kaçırılan tek şey, "Ana Sayfa tuşu" tıklamasıdır, etkinleştirildiğinde bunu faaliyetinizden tespit edemezsiniz, bu nedenle "Geri tuşuna" basıp gerekli etkinliğe geçerek programlı olarak etkinlik yığınını kontrol etmek daha iyi olur sadece gerekli adımları yapıyor.
Ayrıca, etkinliğinizin "Son Etkinlik" listesinden başlatılmasının, bu durumda yeniden kullanıldığı için açılış etkinliği için bazı ekstra verileri önceden ayarlayarak algılanabileceğinden emin olamazsınız.