Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

android - Broadcast Receiver is taking too long to receive in onReceive() after airplane mode turned off/on

I have created a simple Broadcast Receiver and it working absolutely fine except that if i turned on/off the Air Plane Mode, it is taking nearly 2 minutes to receive the broadcasted messages using onReceive method. Another thing is only this is causing a problem if we launch the application and then if i change Air plane Mode (on/off), Then it taking too long to receive the message.

If there is Mode change before launching the application it didn't affect the time to receive the message in onReceive method.

Source code is below.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcastreceiver"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.broadcastreceiver.BroadcastReceiverActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

       <receiver android:name="MyBroadcastReceiver" >
            <intent-filter>
                <action android:name="test.intent.action.QR_CODE_RECEIVER" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

BroadcastReceiverActivity.java

public class BroadcastReceiverActivity extends Activity {

    public static String qrCodeReceiver = "test.intent.action.QR_CODE_RECEIVER";

    @Override
    protected void onCreate(Bundle saveInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button broadcastBtn = (Button) findViewById(R.id.broadcastBtn);
        broadcastBtn.setOnClickListener(new View.onClickListener(){
            public void onClick(View v){
                //TODO
                Intent intent = new Intent();
                intent.putExtra("message","Testing");
                intent.setAction(qrCodeReceiver);
                sendBroadcast(intent);
                Log.d("Test","sendBroadcasting the message ::");
            }
        });
    }
}

MyBroadcastReceiver.java

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //TODO
        Toast.makeText(context, "on receive.",Toast.LENGTH_LONG).show();
        Bundle extras = intent.getExtras();
        String state = extras.getString("message");
        Log.d("Test", "Inside MyBroadcastReceiver onReceive() state :: "+ state);
        Toast.makeText(context, state,Toast.LENGTH_LONG).show();
    }
}

main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".BroadcastReceiverActivity" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

<Button
    android:id="@+id/broadcastBtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView1"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="48dp"
    android:text="Send The BroadCast Message" />

</RelativeLayout>

Thank you in advance.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

In Android System, broadcast are processed internally.

Sometimes, due to system loading/ restart/ high runtime, the broadcast receiver gets time to receive some intent

Workaround is, to add Flag FLAG_RECEIVER_FOREGROUND to intent sending broadcast

intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);

This will speed up the broadcast delivery much than before in problem scenario


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...