Can android application have only broadcast recevi

2019-02-15 16:54发布

问题:

Can android application have only broadcast recevier and service without activity ? If this is possible how can i invoke broadcast receiver ? Android system automatically invokes the broadcsat receiver ?

Code of Broadcastreceiver

  public class CheckReceiver extends BroadcastReceiver {

        public Context con;

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub

            Toast.makeText(context, "Received", Toast.LENGTH_LONG).show();
            // add PhoneStateListener
            PhoneCallListener phoneListener = new PhoneCallListener();
            TelephonyManager telephonyManager = (TelephonyManager) context
                    .getSystemService(Context.TELEPHONY_SERVICE);
            telephonyManager.listen(phoneListener,
                    PhoneStateListener.LISTEN_CALL_STATE);

            con = context;
                                }

        class PhoneCallListener extends PhoneStateListener {

            private boolean isPhoneCalling = false;

            String LOG_TAG = "LOGGING 123";

            @Override
            public void onCallStateChanged(int state, String incomingNumber) {

                if (TelephonyManager.CALL_STATE_RINGING == state) {
                    // phone ringing
                    Log.i(LOG_TAG, "RINGING, number: " + incomingNumber);
                }

                if (TelephonyManager.CALL_STATE_OFFHOOK == state) {
                    // active
                    Log.i(LOG_TAG, "OFFHOOK");

                    isPhoneCalling = true;
                }

                if (TelephonyManager.CALL_STATE_IDLE == state) {
                    // run when class initial and phone call ended, need detect flag
                    // from CALL_STATE_OFFHOOK
                    Log.i(LOG_TAG, "IDLE");
                    if (isPhoneCalling) {
                        Log.i(LOG_TAG, "restart app");
                        Intent start = new Intent(con, CheckService.class);
                        con.startService(start);
                        isPhoneCalling = false;
                    }

                }
            }
        }
    }

Code of Service is

public class CheckService extends Service{

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
        Intent dialogIntent = new Intent(CheckService.this,SmartDialog.class);
        dialogIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(dialogIntent);


        //Toast.makeText(CheckService.this, "Serive", Toast.LENGTH_LONG).show();
    }

}

Android Manifest file is

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

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

    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >

       <receiver android:name="CheckReceiver"></receiver>
        <service android:name="CheckService"></service>
        <activity android:name="SmartDialog" android:theme="@android:style/Theme.Dialog"></activity>
    </application>

when i try to run this code receiver is not getting started . any help would be really helpful

回答1:

Starting with Honeycomb, BroadcastReceivers are installed in a stopped state and will not trigger until an application has actually run, i.e. you will need an activity to have run at least once. This is explained in depth in this Commonsware blog post:

Broadcast Regression Confirmed

Android 3.1



回答2:

public class FlashApkclass extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub

     }
}

In your manifest.xml file set your android:name as like

<receiver android:name="com.example.ambrecentral.server.FlashApkclass"
                android:exported="false">
        <intent-filter>
         // register you broadcast receiver to list broadcast 
           <action android:name="com.example.android.APP_CLOUD_DELETE_APK"/>
        </intent-filter>

</receiver>

and if you want to broadcast

broadcast.setAction(BROADCAST_ACTION);
sendBroadcast(broadcast);

where BROADCAST_ACTION is

public static String BROADCAST_ACTION = "com.example.android.APP_CLOUD_DELETE_APK";