我們做的 APP 上有沒有遇到下面兩種情況
- 在詳情頁或者某個頁面點擊某個操作的時候, 需要登錄驗證, 沒有登錄的時候需要跳轉到登錄界面, 但是有可能還需要再去註冊. 註冊成功後直接登錄, 並且回到跳轉登錄前的頁面.
- APP 需要單點登錄, 有可能在任何一個頁面, 我們正在使用的過程中, 在進行某個操作的時候突然彈窗提示賬號在別的地方被登錄了, 然後我們被擠下線. 那麼這個彈窗要怎麼處理呢?
今天來做一個 ActivityManager
類. 直接複製過去就可以使用喲.
/**
* 懶漢式單例模式, DCL
*/
public class ActivityManager {
private static volatile ActivityManager mInstance;
private Stack<Activity> mActivities;
private ActivityManager() {
mActivities = new Stack<>();
}
public static ActivityManager getInstance() {
if (mInstance == null) {
synchronized (ActivityManager.class) {
if (mInstance == null) {
mInstance = new ActivityManager();
}
}
}
return mInstance;
}
public void attach(Activity activity) {
mActivities.add(activity);
}
public void detach(Activity detachActivity) {
int size = mActivities.size();
for (int i = 0; i < size; i++) {
Activity activity = mActivities.get(i);
if (activity == detachActivity) {
mActivities.remove(i);
i--;
size--;
}
}
}
public void finish(Activity finishActivity) {
int size = mActivities.size();
for (int i = 0; i < size; i++) {
Activity activity = mActivities.get(i);
if (activity == finishActivity) {
mActivities.remove(i);
finishActivity.finish();
i--;
size--;
}
}
}
public void finish(Class<? extends BaseActivity> activityClass) {
int size = mActivities.size();
for (int i = 0; i < size; i++) {
Activity activity = mActivities.get(i);
if (activity.getClass().getCanonicalName().equals(activityClass.getCanonicalName())) {
mActivities.remove(i);
activity.finish();
i--;
size--;
}
}
}
public void exitApplication() {
int size = mActivities.size();
for (int i = 0; i < size; i++) {
Activity activity = mActivities.get(i);
mActivities.remove(i);
activity.finish();
i--;
size--;
}
System.exit(0);
}
/**
* 獲得棧頂的 Activity
*
* @return
*/
public Activity getTopOfStackActivity() {
return mActivities.lastElement();
}
}
接着在 BaseActivity
中
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityManager.getInstance().attach(this);
}
@Override
protected void onDestroy() {
ActivityManager.getInstance().detach(this);
super.onDestroy();
}
}
使用
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("MainActivity");
}
public void click(View view) {
Intent intent = new Intent(this, HomeActivity.class);
startActivity(intent);
}
}
public class HomeActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("HomeActivity");
}
public void click(View view) {
Intent intent = new Intent(this, OrderActivity.class);
startActivity(intent);
}
}
public class OrderActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("OrderActivity");
}
public void click(View view) {
ActivityManager.getInstance().finish(this);
ActivityManager.getInstance().finish(HomeActivity.class);
}
}