Start application without activity, my Broadcast Receiver not work

后端 未结 5 1099
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-19 13:14

In my app, I have a Broadcast Receiver for catching the message sent to my phone



        
相关标签:
5条回答
  • 2020-12-19 13:37

    For Android 3.1 and higher,

    You have to launch one of your activities before any manifest-registered BroadcastReceiver will work.

    See developer docs specifically the section -

    Launch controls on stopped applications for android-3.1

    0 讨论(0)
  • 2020-12-19 13:38

    Ok. Here's what worked for me. I created a launcher activity. Removed the call to setContentView(R.layout.activity_main)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        finish();
    }
    
    0 讨论(0)
  • 2020-12-19 13:41

    If you are testing Broadcast receiver without an Activity then you should edit your run configuration. When the Edit configuration dialog appears, select the Do not launch Activity option so that the activity is installed but not launched and click on the Run button This will launch the application without activity.

    This could help you:

    Creating and Sending the Broadcast Intent

    Having created the framework for the SendBroadcast application, it is now time to implement the code to send the broadcast intent. This involves implementing the broadcastIntent() method specified previously as the onClick target of the Button view in the user interface. Locate and double click on the SendBroadcastActivity.java file and modify it to add the code to create and send the broadcast intent. Once modified, the source code for this class should read as follows:

    package com.ebookfrenzy.sendbroadcast;
    
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.content.Intent;
    import android.view.View;
    
    public class SendBroadcastActivity extends ActionBarActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_send_broadcast);
        }
    
        public void broadcastIntent(View view)
        {
           Intent intent = new Intent();
           intent.setAction("com.ebookfrenzy.sendbroadcast");
           intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
           sendBroadcast(intent);
        }
    .
    .
    .
    }
    

    Creating the Broadcast Receiver

    In order to create the broadcast receiver, a new class needs to be created which subclasses the BroadcastReceiver superclass. Create a new project with the application name set to BroadcastReceiver and the company domain name set to com.ebookfrenzy, this time selecting the Add No Activity option before clicking on Finish.

    Within the Project tool window, navigate to app -> java and right click on the package name. From the resulting menu, select the New -> Other -> Broadcast Receiver menu option, name the class MyReceiver and make sure the Exported and Enabled options are selected.

    Once created, Android Studio will automatically load the new MyReceiver.java class file into the editor where it should read as follows:

    package com.ebookfrenzy.broadcastreceiver;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class MyReceiver extends BroadcastReceiver {
    
        public MyReceiver() {
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO: This method is called when the BroadcastReceiver is receiving
            // an Intent broadcast.
            throw new UnsupportedOperationException("Not yet implemented");
        }
    }
    

    As can be seen in the code, Android Studio has generated a template for the new class and generated a stub for the onReceive() method. A number of changes now need to be made to the class to implement the required behavior. Remaining in the MyReceiver.java file, therefore, modify the code so that it reads as follows:

    package com.ebookfrenzy.broadcastreceiver;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;
    
    public class MyReceiver extends BroadcastReceiver {
    
        public MyReceiver() {
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            Toast.makeText(context, "Broadcast Intent Detected.",
                    Toast.LENGTH_LONG).show();
        }   
    
    }
    

    The code for the broadcast receiver is now complete.

    Configuring a Broadcast Receiver in the Manifest File In common with other Android projects, BroadcastReceiver has associated with it a manifest file named AndroidManifest.xml.

    This file needs to publicize the presence of the broadcast receiver and must include an intent filter to specify the broadcast intents in which the receiver is interested. When the BroadcastReceiver class was created in the previous section, Android Studio automatically added a <receiver> element to the manifest file. All that remains, therefore, is to add an <intent-filter> element within the <receiver> declaration appropriately configured for the custom action string:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.ebookfrenzy.broadcastreceiver.broadcastreceiver" >
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <receiver
                android:name=".MyReceiver"
                android:enabled="true"
                android:exported="true" >
             <intent-filter>
                    <action 
              android:name="com.ebookfrenzy.sendbroadcast" >
                    </action>
                </intent-filter>
            </receiver>
        </application>
    
    </manifest>
    

    With the manifest file completed, the broadcast example is ready to be tested.

    0 讨论(0)
  • 2020-12-19 13:52

    This is because Android OS does not allow BroadcastReceiver to receive some important broadcast(android.provider.Telephony.SMS_RECEIVED must be one of it) if the app´s process is not alive.It was designed to against the evil apps. If you have an activity running,your process is alive and so your receiver is allowed to receive the broadcast.

    I think you can make a transparent activity and use startService to start a service in background,then finish the activity.As your service is running ,your process is alive,so the Android OS will let you to receive the broadcast.

    0 讨论(0)
  • 2020-12-19 13:58

    add DEFAULT category in your intent filter

     <category android:name="android.intent.category.DEFAULT" />
    
    0 讨论(0)
提交回复
热议问题