Android BroadcastReceiver on startup - keep running when Activity is in Background

后端 未结 5 578
眼角桃花
眼角桃花 2020-11-22 05:34

I\'m monitoring incoming SMSs.

My app is working perfectly with a BroadcastReceiver. However it is working from an Activity and would like to keep the <

相关标签:
5条回答
  • 2020-11-22 05:56

    Add Broadcast Reciever in manifest:

      <receiver android:name=".BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>
    

    Create Class BootReciever.java

    public class BootReceiver extends BroadcastReceiver {
       @Override
       public void onReceive(Context context, Intent intent) {
           if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
    
               // +++ Do Operation Here +++
    
           }
       }
    }
    
    0 讨论(0)
  • 2020-11-22 05:56

    use this code and also mention the broadcast in Manifest also:

    public class BootService extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
                Toast.makeText(context, "Boot Completed", Toast.LENGTH_SHORT).show();
                //write code here
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-22 05:58

    Service or Boot Completed is not mandatory

    In fact, you don't need to implement a Service or register to android.intent.action.BOOT_COMPLETED

    Some examples shows how to register/unregister a BroadcastReceiver when activity is created and destroyed. However, this is useful for intents that you expect only when app is opened (for internal communication between Service/Activity for example).

    However, in case of a SMS, you want to listen to the intent all the time (and not only when you app is opened).

    There's another way

    You can create a class which extends BroadcastReceiver and register to desired intents via AndroidManifest.xml. This way, the BroadcastReceiver will be indepedent from your Activity (and will not depend from Activity's Life Cycle)

    This way, your BroadcastReceiver will be notified automatically by Android as soon as an SMS arrive even if your app is closed.

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest>
        ...
        <uses-permission android:name="android.permission.READ_SMS"/>
        <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    
        <application>
            ....
            <receiver android:name=".MyCustomBroadcastReceiver">
                <intent-filter>
                    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                </intent-filter>
            </receiver>
        </application>
    </manifest>
    

    MyCustomBroadcastReceiver.java

    public class MyCustomBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent != null) {
                String action = intent.getAction();
                if(action != null) {
                    if(action.equals("android.provider.Telephony.SMS_RECEIVED")) {
                        // DO YOUR STUFF
                    } else if (action.equals("ANOTHER ACTION")) {
                        // DO ANOTHER STUFF
                    }
                }
            }
        }
    }
    

    Notes

    You can add others intent-filters to AndroidManifest and handle all of them in same BroadcastReceiver.

    Start a Service only if you will perform a long task. You just need to display a notification or update some database, just use the code above.

    0 讨论(0)
  • 2020-11-22 06:06

    Beside @Javanator answer I would like to include a case for Android version of (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) In my case this is working for Android SDK 29 (10)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
          context.startForegroundService(new Intent(context,FloatingWindow.class));
    } else {
          context.startService(new Intent(context, FloatingWindow.class));
      }
    
    0 讨论(0)
  • 2020-11-22 06:13

    You need to define a receiver in manifest with action name android.intent.action.BOOT_COMPLETED.

    <!-- Start the Service if applicable on boot -->
    <receiver android:name="com.prac.test.ServiceStarter">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>
    

    Make sure also to include the completed boot permission.

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    

    Use Service for this to make anything persist. And use receivers to receive Boot Up events to restart the service again if system boots..

    Code for Starting Service on boot up. Make Service do your work of checking sms or whatever you want. You need to do your work in MyPersistingService define it your self.

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    
    public class ServiceStarter extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Intent i = new Intent("com.prac.test.MyPersistingService");
            i.setClass(context, MyPersistingService.class);
            context.startService(i);
        }
    }
    
    0 讨论(0)
提交回复
热议问题