অ্যান্ড্রয়েডে এয়ারপ্লেন মোড পরিবর্তন (Change) ডিটেক্ট করা
এই টিউটোরিয়ালে শিখব কিভাবে `BroadcastReceiver` ব্যবহার করে এয়ারপ্লেন মোড অন/অফ হওয়ার মুহূর্তে ডিটেক্ট করা যায়। এটি আর্টিকেল ১০০৬০৬১২৩৩-এর সাথে মিলিত কিন্তু ফোকাস পরিবর্তন ইভেন্টে।
প্রয়োজনীয় ধাপসমূহ
ধাপ ১: নতুন প্রজেক্ট তৈরি করুন
Android Studio-তে File → New Project নির্বাচন করে প্রজেক্ট তৈরি করুন।
ধাপ ২: লেআউট ফাইল
res/layout/activity_main.xml ফাইলে:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/text"
android:textSize="30sp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="16dp" />
</LinearLayout>
ধাপ ৩: জাভা কোড (MainActivity.java)
package com.example.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView textView;
private BroadcastReceiver airplaneModeChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text);
// বর্তমান স্ট্যাটস দেখাও
boolean currentState = isAirplaneModeOn(this);
textView.setText("বর্তমান: " + (currentState ? "চালু ✈️" : "বন্ধ 📱"));
// পরিবর্তন লিসেনার সেটআপ
setupChangeListener();
}
private boolean isAirplaneModeOn(Context context) {
return Settings.Global.getInt(context.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
}
private void setupChangeListener() {
airplaneModeChangeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// শুধু এয়ারপ্লেন মোড চেঞ্জ একশন ফিল্টার
if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())) {
boolean newState = intent.getBooleanExtra("state", false);
String message = "এয়ারপ্লেন মোড পরিবর্তন হয়েছে: " + (newState ? "চালু ✈️" : "বন্ধ 📱");
textView.setText(message);
// লগিং
Log.d("AirplaneMode", message);
}
}
};
// স্পেসিফিক একশন ফিল্টার (শুধু AIRPLANE_MODE_CHANGED)
IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
registerReceiver(airplaneModeChangeReceiver, filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
// অবশ্য আনরেজিস্টার করুন
if (airplaneModeChangeReceiver != null) {
unregisterReceiver(airplaneModeChangeReceiver);
}
}
}
ACTION_AIRPLANE_MODE_CHANGED ব্রডকাস্ট
- একশন: `android.intent.action.AIRPLANE_MODE_CHANGED`
- এক্সট্রা: `state` (boolean) - নতুন স্ট্যাটাস (true = অন, false = অফ)
- প্রকার: স্টিকি ব্রডকাস্ট নয় (শুধু পরিবর্তনের সময় পাঠানো হয়)
- পারমিশন: কোনো পারমিশন দরকার নেই
দুই ব্রডকাস্টের পার্থক্য
| ব্রডকাস্ট | একশন স্ট্রিং | উদ্দেশ্য |
|---|---|---|
| এয়ারপ্লেন মোড স্ট্যাটাস | android.intent.action.AIRPLANE_MODE | বর্তমান স্ট্যাটাস জানান (সিস্টেম বুটে) |
| এয়ারপ্লেন মোড চেঞ্জ | android.intent.action.AIRPLANE_MODE_CHANGED | বদলाव ঘটলে নোটিফাই |
নোট: আর্টিকেল ১০০৬০৬১২৩৩-এ `AIRPLANE_MODE` ব্যবহার করা হয়েছে, যা কম্প্যাটিবিলিটির জন্য। আধুনিক কোডে `AIRPLANE_MODE_CHANGED` ব্যবহার করুন।
ব্যাকগ্রাউন্ডে লিসেনিং (ম্যানিফেস্ট রেজিস্ট্রেশন)
AndroidManifest.xml-এ:
<receiver android:name=".AirplaneModeChangeReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.AIRPLANE_MODE_CHANGED" />
</intent-filter>
</receiver>
AirplaneModeChangeReceiver.java:
public class AirplaneModeChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())) {
boolean isOn = intent.getBooleanExtra("state", false);
// ব্যাকগ্রাউন্ড টাস্ক: নোটিফিকেশন, লগিং, ওয়ার্কম্যানেজার ট্রিগার
// UI আপডেট না করুন (অ্যাপ ফোরগ্রাউন্ডে নাও থাকতে পারে)
}
}
}
WorkManager দিয়ে ব্যাকগ্রাউন্ড সিঙ্ক (আধুনিক পদ্ধতি)
// রিসিভারে WorkManager এনকিউ
OneTimeWorkRequest syncWork = new OneTimeWorkRequest.Builder(SyncWorker.class)
.setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED) // এয়ারপ্লেন মোড অফ হলে
.build())
.build();
WorkManager.getInstance(context).enqueue(syncWork);
অ্যাপ্লিকেশন চালানো
রান করলে বর্তমান স্ট্যাটাস দেখাবে। কুইক সেটিংস থেকে এয়ারপ্লেন মোড টগল করলে "এয়ারপ্লেন মোড পরিবর্তন হয়েছে: ..." মেসেজ দেখাবে।
লক্ষ্য করুন
- onDestroy-এ unregisterReceiver() কল করুন (ক্রিটিক্যাল)
- UI থ্রেডে भরী কাজ না করুন onReceive-এ (ANR রোধ)
- ব্যাকগ্রাউন্ড কাজের জন্য WorkManager/Service ব্যবহার করুন
- Android 8+ (API 26+) ইমপ্লিসিট ব্রডকাস্ট রিস্ট্রিকশন - এই একশন مستثনা