Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BroadcastReceiver在后台OREO+;_Java_Android - Fatal编程技术网

Java BroadcastReceiver在后台OREO+;

Java BroadcastReceiver在后台OREO+;,java,android,Java,Android,在我的应用程序中有两个接收器,一个接收呼叫(MyReceiverCall),另一个接收短信(MyReceiverSms)。 当你启动应用程序时,一切正常,我收到短信或电话时会收到通知。 但是,如果我在task Manager中关闭应用程序,则没有任何功能可用,所有传入的短信和呼叫都会被接收器忽略。 我有一个假设,可以简单地用我的通知服务不启动,但通过日志我了解到,接收器根本不工作。(但到目前为止,我们的假设是服务业应该受到责备) 我的代码 MyReceiverCall.class public

在我的应用程序中有两个接收器,一个接收呼叫(
MyReceiverCall
),另一个接收短信(
MyReceiverSms
)。 当你启动应用程序时,一切正常,我收到短信或电话时会收到通知。 但是,如果我在task Manager中关闭应用程序,则没有任何功能可用,所有传入的短信和呼叫都会被接收器忽略。 我有一个假设,可以简单地用我的通知服务不启动,但通过日志我了解到,接收器根本不工作。(但到目前为止,我们的假设是服务业应该受到责备)

我的代码

MyReceiverCall.class

public class MyReceiverCall extends BroadcastReceiver {
    private static final String ACTION = "android.intent.action.PHONE_STATE";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("123","sakuraso13 ReceiverCall");
        if (intent != null && intent.getAction() != null) {
            if (intent.getAction().equals(ACTION)) {
                String number=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING) & number!=null) {

                     // some operation with number phone
                        Intent intentService = new Intent(context, ServiceMain.class);
                        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                            context.startForegroundService(intentService);

                        }else {
                            context.startService(intentService);
                        }
                }
                }
            }
        }
    }
   public class MyReceiverSms extends BroadcastReceiver {
        private static final String TAG="MyReceiverSms";
        private static final String ACTION="android.provider.Telephony.SMS_RECEIVED";

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i("123","sakuraso13 ReceiverWorking");
            if(intent !=  null && intent.getAction()!=null) {
                if (intent.getAction().equals(ACTION)) {
                    // some operation with number phone
                        Intent intentService=new Intent(context, ServiceMain.class);
                        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                            context.startForegroundService(intentService);
                        }else {
                            context.startService(intentService);
                        }

                    }


                }
            }
        }

    }
public class ServiceMain extends Service {


    public ServiceMain() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return null;
    }



    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundNotification();
        }
        showSimpleNotification(); 
    }
MyReceiverSms.class

public class MyReceiverCall extends BroadcastReceiver {
    private static final String ACTION = "android.intent.action.PHONE_STATE";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("123","sakuraso13 ReceiverCall");
        if (intent != null && intent.getAction() != null) {
            if (intent.getAction().equals(ACTION)) {
                String number=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING) & number!=null) {

                     // some operation with number phone
                        Intent intentService = new Intent(context, ServiceMain.class);
                        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                            context.startForegroundService(intentService);

                        }else {
                            context.startService(intentService);
                        }
                }
                }
            }
        }
    }
   public class MyReceiverSms extends BroadcastReceiver {
        private static final String TAG="MyReceiverSms";
        private static final String ACTION="android.provider.Telephony.SMS_RECEIVED";

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i("123","sakuraso13 ReceiverWorking");
            if(intent !=  null && intent.getAction()!=null) {
                if (intent.getAction().equals(ACTION)) {
                    // some operation with number phone
                        Intent intentService=new Intent(context, ServiceMain.class);
                        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                            context.startForegroundService(intentService);
                        }else {
                            context.startService(intentService);
                        }

                    }


                }
            }
        }

    }
public class ServiceMain extends Service {


    public ServiceMain() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return null;
    }



    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundNotification();
        }
        showSimpleNotification(); 
    }
ServiceMain.class

public class MyReceiverCall extends BroadcastReceiver {
    private static final String ACTION = "android.intent.action.PHONE_STATE";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("123","sakuraso13 ReceiverCall");
        if (intent != null && intent.getAction() != null) {
            if (intent.getAction().equals(ACTION)) {
                String number=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING) & number!=null) {

                     // some operation with number phone
                        Intent intentService = new Intent(context, ServiceMain.class);
                        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                            context.startForegroundService(intentService);

                        }else {
                            context.startService(intentService);
                        }
                }
                }
            }
        }
    }
   public class MyReceiverSms extends BroadcastReceiver {
        private static final String TAG="MyReceiverSms";
        private static final String ACTION="android.provider.Telephony.SMS_RECEIVED";

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i("123","sakuraso13 ReceiverWorking");
            if(intent !=  null && intent.getAction()!=null) {
                if (intent.getAction().equals(ACTION)) {
                    // some operation with number phone
                        Intent intentService=new Intent(context, ServiceMain.class);
                        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                            context.startForegroundService(intentService);
                        }else {
                            context.startService(intentService);
                        }

                    }


                }
            }
        }

    }
public class ServiceMain extends Service {


    public ServiceMain() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return null;
    }



    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundNotification();
        }
        showSimpleNotification(); 
    }
AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="app.service.detector">

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.BROADCAST_SMS"/>
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

    <application
        android:name="detector.sakuraso13.App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:networkSecurityConfig="@xml/network_security_config"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service
            android:name="detector.sakuraso13.Service.ServiceMain"
            android:enabled="true"
            android:exported="true"></service>

        <receiver
            android:name="detector.sakuraso13.Broadcaster.MyReceiverCall"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="2147483647">
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"
                    android:priority="2147483647"/>
                <action android:name="android.intent.action.PHONE_STATE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        <receiver
            android:name="detector.sakuraso13.Broadcaster.MyReceiverSms"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.BROADCAST_SMS">
            <intent-filter android:priority="2147483647">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

        <activity android:name="detector.sakuraso13.Main.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

我认为这是预期的行为(当你杀死应用程序时)。我可以想象,出于安全原因,它是有帮助的。@ror但是,即使应用程序被终止,您如何使接收器工作,否则,处理传入短信和呼叫的应用程序如何工作