1. 程式人生 > >Android實現強制下線(不同應用之間)功能————簡易微信聊天示例

Android實現強制下線(不同應用之間)功能————簡易微信聊天示例

Android的實現強制下線(不同應用之間)功能----簡易微信聊天示例

強制下線功能需要先關閉所有活動,然後在回到登入介面。

新建一個ActivityCollector類管理所有活動。下見程式碼段:

//需要用到一個專門的集合類對所有的活動進行管理
public class ActivityCollector {
    public  static List<Activity> activities = new ArrayList<>();//通過一個List來暫存活動

    public static void addActivity(Activity activity){
        activities.add(activity);//提供了一個addActivity()方法用於向List中新增一個活動
    }


    public static void removeActivity(Activity activity){
        activities.remove(activity);//提供了一個addActivity()方法用於從List中移除一個活動

    }

    public static void finishAll(){//finish()方法用於將List中儲存的活動全部銷燬掉
        for (Activity activity : activities){
            if (!activity.isFinishing()){
                activity.finish();
            }
        }
        activities.clear();
    }
}

BaseSActivity.java中呼叫

首先需要我們希望在另外一個應用點選了[強制下線]的按鈕時,當前應用不論在哪個頁面,都可以接受到此類廣播。如果在每個活動上都註冊一個廣播接受器時,常會導致程式碼冗餘。

 

答案其實很明顯,只需新建一個類(命名:BaseSActivity.java),註冊一個廣播接受器,並且,讓所有活動都繼承BaseSActivity.java這樣強制下線的功能就不會依附任何介面

 

 

在同一個模型下的應用,接受廣播是使用的onResume()和的onPause()方法註冊和取消註冊廣播。

 

如果在不同型號之間聯絡的應用,使用上述方法是行不通的。採用動態註冊的廣播接受器

例如:A應用:傳送廣播B應用:接受廣播

 

甲應用傳送廣播,B應用等待接收。當執行切換程式(A→B)的操作時,系統就會呼叫的onPause()方法。此時,廣播已經被登出。在乙應用也就無法接收來自甲應用的廣播。

因此,選擇在的onCreate()和onDestory()方法執行廣播的註冊和登出。

 

以下是部分程式碼:

一個應用:傳送廣播

  forceOffline.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent =
                        new Intent("com.example.danser.mywechat.ForceOfflineReceiver");
                sendBroadcast(intent);

            }
        });

 

乙應用:接受廣播

public class BaseActivity extends AppCompatActivity {

    private ForceOfflineReceiver receiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityCollector.addActivity(this);

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.danser.mywechat.ForceOfflineReceiver");//接受廣播
        receiver = new ForceOfflineReceiver();//註冊廣播器
        registerReceiver(receiver,intentFilter);
    }


    @Override
    protected void onDestroy() {///取消註冊廣播器
        super.onDestroy();
        if (receiver != null){
            unregisterReceiver(receiver);
            receiver = null;
        }
        ActivityCollector.removeActivity(this);
    }


    class ForceOfflineReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(final Context context, Intent intent) {

                AlertDialog.Builder builder = new AlertDialog.Builder(context);//使用Builder構建一個對話方塊
                builder.setTitle("提示");
                builder.setMessage("你的微訊號在其他裝置上登入," +
                        "如不是本人操作,請及時更改密碼!");
                builder.setCancelable(false);//將對話方塊設定為不可取消
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCollector.finishAll();//銷燬所有活動
                        Intent i = new Intent(context, LoginActivity.class);
                        context.startActivity(i);//重啟登入介面
                    }
                });
                builder.show();
            }
    }
}

 

接下來需要,好好補遺漏的知識了。