當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 實(shí)現(xiàn)一鍵退出所有的activity
方式一:動(dòng)態(tài)注冊(cè)廣播實(shí)現(xiàn)
------- 思路:給每一個(gè)運(yùn)行的Activity都設(shè)置廣播監(jiān)聽器,并
且監(jiān)聽的廣播監(jiān)聽器的Type都是相同的
--------動(dòng)態(tài)注冊(cè)廣播監(jiān)聽器并實(shí)施監(jiān)聽
--------這樣當(dāng)所有監(jiān)聽的Activity同類型的Type就會(huì)監(jiān)聽到,
--------然后Finsh(),這樣就可以實(shí)現(xiàn)一鍵退出所有的 Activity
方式二:把所有的activty放入同一個(gè)List中,從List中
取出所有activity調(diào)用finish()方法
方式三:拋出異常
方式四:SingleTask
———————————————————————————
代碼實(shí)現(xiàn):動(dòng)態(tài)注冊(cè)廣播實(shí)現(xiàn)
在一個(gè)Activity中發(fā)送廣播
package demo.baidumapsdk.onekey_backactivity;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//發(fā)送廣播
public void send(View view){
//發(fā)送廣播
Intent intent = new Intent();
intent.setAction("back");//設(shè)置發(fā)送廣播類型
MainActivity.this.sendBroadcast(intent);//發(fā)送廣播
}
___________________________________________________________
在另一個(gè)Activity中動(dòng)態(tài)注冊(cè)廣播并監(jiān)聽
package demo.baidumapsdk.mychar1;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.hyphenate.chat.EMClient;
import com.hyphenate.exceptions.HyphenateException;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//動(dòng)態(tài)注冊(cè)廣播
MyReceive myReceive = new MyReceive();
IntentFilter filter = new IntentFilter();
filter.addAction("back");
registerReceiver(myReceive,filter);
———————————————————————————
在動(dòng)態(tài)注冊(cè)廣播監(jiān)聽的Activity中寫類實(shí)現(xiàn)BroadCastReceive,并重寫onReceive方法
package demo.baidumapsdk.mychar1;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
//動(dòng)態(tài)注冊(cè)廣播監(jiān)聽
public class MyReceive extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String intent1 = intent.getAction();//獲取廣播類型
//TODO
//在這里就可以操作一些事情,比如退出Activity
Toast.makeText(context,intent1,Toast.LENGTH_SHORT).show();
}
}
___________________________________________________________
代碼實(shí)現(xiàn)方式二:把所有的activty放入同一個(gè)List中,從List中
取出所有activity調(diào)用finish()方法
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//把當(dāng)前Activity裝進(jìn)list,類名.對(duì)象
Util_List.list.add(this);
//創(chuàng)建Button
Button button = new Button(this);
button.setText("啟動(dòng)A");
setContentView(button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,TwoActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
Util_List.list.remove(this);
super.onDestroy();
Log.i("Fslog","MyActivity的OnDestory被執(zhí)行");
}
}
———————————————————————————
public class TwoActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//將當(dāng)前的Activity裝進(jìn)list
Util_List.list.add(this);
//不依賴布局文件,自己創(chuàng)建
Button button = new Button(this);
button.setText("退出");
setContentView(button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TwoActivity.this.finish();
}
});
}
@Override
protected void onDestroy() {
//從list中取出所有的Activity,執(zhí)行finsh方法
//在遍歷值前應(yīng)該判斷:如果你遍歷的是一個(gè)空的Activity對(duì)象,
// for-each循環(huán)將拋出NullPointerException,因此在遍歷前你總是應(yīng)該檢查空引用。
if (Util_List.list!=null){
//遍歷:第一部分:是遍歷的對(duì)象(Activity),第二部
分:是存放對(duì)象的容器(Util_List.list)
for (Activity activity:Util_List.list){
activity.finish();
}
}
super.onDestroy();
}
}
———————————————————————————
public class Util_List {
public static final ArrayList
}
———————————————————————————
方式三:使用啟動(dòng)模式SingleTask
在這個(gè)地方:我們要注意啟動(dòng)模式設(shè)置為SingleTask必須是入口組件
SingleTask是單一實(shí)例,后會(huì)回調(diào)onNewIntent()
onNewIntent的回調(diào)機(jī)制:launchMode為singleTask的時(shí)候,通過Intent啟到一個(gè)Activity,如果系統(tǒng)已經(jīng)存在一個(gè)實(shí)例,系統(tǒng)就會(huì)將請(qǐng)求發(fā)送到這個(gè)實(shí)例上,但這個(gè)時(shí)候,系統(tǒng)就不會(huì)再調(diào)用通常情況下我們處理請(qǐng)求數(shù)據(jù)的onCreate方法,而是調(diào)用onNewIntent方法, 不要忘記,系統(tǒng)可能會(huì)隨時(shí)殺掉后臺(tái)運(yùn)行的Activity,如果這一切發(fā)生,那么系統(tǒng)就會(huì)調(diào)用onCreate方法,而不調(diào)用onNewIntent方法,一個(gè)好的解決方法就是在onCreate和onNewIntent方法中調(diào)用同一個(gè)處理數(shù)據(jù)的方法
__________________________________________________________________
代碼:
android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
android:launchMode="singleTask">
———————————————————————————
@Override
protected void onNewIntent(Intent intent) {
finish();
super.onNewIntent(intent);
}