BroadcastReceiverのOnとOffを切り替える機能を実装した話

#はじめに
Androidのアプリ開発をjavaで行っています。BroadcastReceiverで動くバックグラウンドの機能を任意で稼働させたり停止出来たら良いと思い、実装の際少し苦労したため、備忘録を綴っておきます。


#MainActivityからBroadcastReceiverの動作を切り替えたい
Boolean型のFlagを用いることで機能のOn/OffをActivityから行えたらと思い、とりあえずXMLファイルでToggleButtonを実装しました。

```main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="稼動切り替え" />

        <ToggleButton
            android:id="@+id/toggleButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="On/Off" />
    </LinearLayout>

</LinearLayout>

```

###Flagのクラスを作成し、ToggleButtonで切り替える
初めに思いついたのは、Flagのクラスを作成し、MainActivityでOn/Offを切り替え、BroadcastReceiver側のクラスでFlagの値を参照する方法です。

```Flag.java

public class Flag {
    public static Boolean flg;
}


```

```MainActivity.java

        toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    Flag.flg = true;
                }else{
                    Flag.flg = false;
                }
            }
        });

```

この値を用いた条件文をBroadcastReceiver側に実装してあげればいけそうでは？と思い、とりあえず走らせてみました。

####実行結果
Activityを起動している間は、BroadcastReceiver側もToggleButtonの値に従って実装の切り替えに成功していました。
しかし、アプリのタスクを切ってしまうと、ToggleButtonをOnにしていてもBroadcastReceiverが機能しない……


###SharedPreferencesで保存した値に注目する
このままでは実装不可能と思い、SharedPreferencesに注目してみました。ToggleButtonの状態が切り替わったら、その値を保存し、BroadcastReceiver側で読み取ることで条件文を機能させようという魂胆です。

```MainActivity.java

        SharedPreferences pref = getSharedPreferences("pref",MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        boolean isChecked = pref.getBoolean("boolean", false);

        CompoundButton toggle = (CompoundButton) findViewById((R.id.toggleButton));
        toggle.setChecked(isChecked);
        toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                editor.putBoolean("boolean", isChecked);
                editor.apply();
            }
        });

```

とりあえず、これでToggleButtonの値を保存することに成功しました。あとはBroadcastReceiver側で保存している値を読み取っていきます。

```BackGround.java

public class BackGround extends BroadcastReceiver {

    private Context ctx;
    SharedPreferences pref;
    private Boolean flg;

    public void onReceive(Context context, Intent intent) {
        ctx = context;
        pref = ctx.getSharedPreferences("pref", Context.MODE_PRIVATE);
        flg = pref.getBoolean("boolean", false);
        
        //その他の処理

    }


```

####実行結果
今度は、アプリを稼働させている間はもちろん、アプリのタスクを切ってもSharedPreferencesに保存されている値がflgに代入されるため、条件文によって機能を分岐させることに成功しました。

#最後に
良く考えてみれば、最初に実装した方法では明らかに厳しいですね…
まだまだ経験と知識が足りていないと実感する今日この頃です。
Contextという抽象クラス(?)についてはまだ理解が足りていないと感じるため、これから学んでいきたいと思いました。
アドバイス、質問等ありましたらコメント欄にてお願い致します。
最後までお付き合い頂きありがとうございました。