Create an automatic launch-able Broadcast Receiver

2020-04-30 17:26发布

Problem:

I am willing to create an application that simply starts as a background process and whenever a new message comes into the device it should log it into a file or simply display a toast message.

I have read a lot of blogs and tried to follow the steps as mentioned. But, I keep on sending messages on my device and nothing displayed not even in device log. I want to run it on devices from Froyo to Lollipop. So, I am not willing to use new Telephony API which supports API 19 and later versions.

Manifest File

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.abc.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >



        <receiver android:name=".SMSHandler">

            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

    </application>

</manifest>

Source File

package com.abc.test;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class SMSHandler extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Toast toast = Toast.makeText(context, "message initiated",
                Toast.LENGTH_LONG);
        toast.show();

        if (intent.getAction()
                .equals("android.provider.Telephony.SMS_RECEIVED")) {
            toast = Toast.makeText(context, "message received",
                    Toast.LENGTH_LONG);
            toast.show();
        }
    }

}

Environment:

IDE:

  • Android Studio

Min SDK Version:

  • 8

Tested On:

  • ICS Device (Sony Xperia U)
  • Kit-Kat (MOTO G)

2条回答
再贱就再见
2楼-- · 2020-04-30 18:15

Your Code look like this in manifest file

    <receiver android:name=".SMSHandler"
        android:exported="true"
        android:enabled="true">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
        </intent-filter>
    </receiver>

Add the following to your<receiver> in the manifest:

android:enabled="true" android:exported="true">

Furthermore, according to this thread, it seems that you have to manually start one of your activities before the broadcast receiver will start working, i.e. the application has to have been launched at least once before any broadcast receiver will work.

查看更多
再贱就再见
3楼-- · 2020-04-30 18:25

You need to add an activity, then run that activity, before this BroadcastReceiver will work.

More accurately, something needs to use an explicit Intent before your app will be moved out of the stopped state and allow manifest-registered BroadcastReceivers to work. The simplest way to do that is to have a launcher activity, and run that activity from the launcher.

To learn more, see "Launch controls on stopped applications" in the Android 3.1 release notes, along with this blog post.

查看更多
登录 后发表回答