Ho avuto questo problema alcuni giorni fa, e sono felice di dirvi che ho trovato un modo per aggirare questo.
Prima di tutto, per l'attività che si vuole fermare aggiungere questo nel AndroidManifest.xml
:
android:launchMode="singleTop"
ho intenzione di usare un esempio CheckBox. Quando viene controllato, l'attività viene avviata e, quando deselezionata, uccide l'attività.
Attività di esempio A chiama l'attività B e quindi lo uccide utilizzando un intento.
Codice da mettere in A:
checkbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(A.this, B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
if (enable.isChecked()) {
intent.putExtra("keep", true);
startActivity(intent);
}
else
{
intent.putExtra("keep", false);
startActivity(intent);
}
}
});
Codice da mettere in B:
boolean keep;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.B);
intent = this.getIntent();
boolean keep = intent.getExtras().getBoolean("keep");
if(keep==true)
{
//execute your code here
}
}
@Override
protected void onNewIntent(Intent intent)
{
super.onNewIntent(intent);
keep = intent.getExtras().getBoolean("keep");
if(keep==false)
{
B.this.finish();
}
}
Spiegazione: Quello che fa è fondamentalmente, quando la casella è selezionata si chiama l'attività e passa un valore booleano, se è vero l'attività viene tenuta in vita e portata in primo piano. Ora, se non superi il flag singleTop
, verranno create molte istanze di questa attività. singleTop
si assicura che venga chiamata solo la stessa istanza. Ora, quando la casella di spunta è deselezionata, viene passato un nuovo valore per keep che viene verificato in B. Se deselezionata, l'attività A passerà falsa, e quindi B termina all'interno della funzione onNewIntent()
.
P.S - È possibile chiudere l'attività B anche da un'altra attività. Basta usare Se l'altra attività è C:
Intent intent = new Intent(C.this, B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("keep", false);
startActivity(intent);
Sembra che sarebbe una violazione di sicurezza se un'applicazione potrebbe uccidere un altro. – EJK
A meno che l'applicazione di destinazione non abbia pubblicato questa funzionalità tramite un Intento. – EJK