Android 始终使用BroadcastReceiver运行服务以进行呼叫窃听 我的要求

Android 始终使用BroadcastReceiver运行服务以进行呼叫窃听 我的要求,android,broadcastreceiver,android-broadcast,Android,Broadcastreceiver,Android Broadcast,我正在尝试构建一个应用程序,每当用户从手机拨出电话时,它都会显示一个祝酒词。为此,我使用BroadcastReceiver点击调用操作和服务(始终运行Receiver)。一旦我开始这项活动,它开始显示吐司时,一个传出的电话开始…一切都很好 问题 有时我甚至连呼出电话的祝酒动作都没有,这是不是意味着服务会在一段时间后停止 手机重新启动后,传出呼叫的Toast操作停止。直到您再次手动启动服务 我写的代码可以吗?还是可以改进 下面是完整的代码- 主课 public class MainActivity

我正在尝试构建一个应用程序,每当用户从手机拨出电话时,它都会显示一个祝酒词。为此,我使用BroadcastReceiver点击调用操作和服务(始终运行Receiver)。一旦我开始这项活动,它开始显示吐司时,一个传出的电话开始…一切都很好

问题
  • 有时我甚至连呼出电话的祝酒动作都没有,这是不是意味着服务会在一段时间后停止

  • 手机重新启动后,传出呼叫的Toast操作停止。直到您再次手动启动服务

  • 我写的代码可以吗?还是可以改进

  • 下面是完整的代码-

    主课

    public class MainActivity extends Activity 
    {
        CallNotifierService m_service;
        boolean isBound = false;
    
        private ServiceConnection m_serviceConnection = new ServiceConnection() 
        {
            @Override
            public void onServiceConnected(ComponentName className, IBinder service) 
            {
                m_service = ((CallNotifierService.MyBinder)service).getService();
                Toast.makeText(MainActivity.this, "Service Connected", Toast.LENGTH_LONG).show();
                isBound = true;
                Intent intent = new Intent(MainActivity.this, CallNotifierService.class);
                startService(intent);
            }
    
            @Override
            public void onServiceDisconnected(ComponentName className) 
            {
                m_service = null;
                isBound = false;
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Intent intent = new Intent(this, CallNotifierService.class);
            bindService(intent, m_serviceConnection, Context.BIND_AUTO_CREATE);
        }
        .
        .
        .
    }
    
    CallNotifierService.class

    public class CallNotifierService extends Service 
    {
        private final IBinder myBinder = new MyBinder();
        private static final String ACTION_OUTGOING_CALL = "android.intent.action.NEW_OUTGOING_CALL";
        private static final String ACTION_ANSWER = "android.intent.action.ANSWER";
        private static final String ACTION_CALL = "android.intent.action.CALL";
    
        private CallBr br_call;
    
        @Override
        public IBinder onBind(Intent arg0) 
        {
            return myBinder;
        }
    
        @Override
        public void onDestroy() 
        {
            Log.d("service", "destroy");
            this.unregisterReceiver(this.br_call);
            Toast.makeText(CallNotifierService.this, "Receiver Un-Registered", Toast.LENGTH_LONG).show();
            super.onDestroy();
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId)
        {
            final IntentFilter filter = new IntentFilter();
            filter.addAction(ACTION_ANSWER);
            filter.addAction(ACTION_CALL);
            filter.addAction(ACTION_OUTGOING_CALL);
            this.br_call = new CallBr();
            this.registerReceiver(this.br_call, filter);
            Toast.makeText(CallNotifierService.this, "onStartCommand Called", Toast.LENGTH_LONG).show();
            return START_STICKY;
        }
    
        public class MyBinder extends Binder 
        {
            CallNotifierService getService() 
            {
                return CallNotifierService.this;
            }
        }
    
        public class CallBr extends BroadcastReceiver 
        {
            public CallBr() {}
    
            @Override
            public void onReceive(Context context, Intent intent) 
            {
                Toast.makeText(context, "Action:"+intent.getAction(), Toast.LENGTH_LONG).show();
            }
        }
    }
    
    Manifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.alwaysrunningprocesswithcallanswertap"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.CALL_PHONE" />
    
        <uses-sdk
            android:minSdkVersion="22"
            android:targetSdkVersion="22" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <service android:name="com.example.alwaysrunningprocesswithcallanswertap.CallNotifierService" />
        </application>
    
    </manifest>
    
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.newbootservice"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="15" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
    
            <service android:name=".AutostartService"/>
    
            <receiver android:name=".BootCompleteReceiver">  
                <intent-filter>     
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>  
                    <category android:name="android.intent.category.DEFAULT" />  
                </intent-filter>  
            </receiver>
    
            <activity
                android:name=".MainActivity"
                android:label="@string/title_activity_main" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    
    
    

    是否有人能为这个问题提供帮助或指出更好的方法?

    @Bharat一旦设备自动关闭,服务将停止,因此当您的设备重新启动时,您需要再次启动服务,那么只有您才能获得Toast操作,请参考以下示例代码:

    BootCompleteReceiver.java

    package com.example.newbootservice;
    
    import android.content.BroadcastReceiver;  
    import android.content.Context;  
    import android.content.Intent;    
    
    public class BootCompleteReceiver extends BroadcastReceiver {   
    
    @Override  
    public void onReceive(Context context, Intent intent) {  
    
       Intent service = new Intent(context, AutostartService.class);  
       context.startService(service);   
    
            }  
    
        }
    
    package com.example.newbootservice;
    
    import android.app.Service;  
    import android.content.Intent;  
    import android.os.IBinder;   
    import android.widget.Toast;
    
    public class AutostartService extends Service {  
    
    
        @Override  
        public void onCreate() {  
            super.onCreate();    
        }  
    
        @Override  
        public int onStartCommand(Intent intent, int flags, int startId) {  
    
            Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
            return Service.START_STICKY;  
        }  
    
        @Override
        public void onDestroy() {
    
            super.onDestroy();
            Toast.makeText(this, "Service Destroy", Toast.LENGTH_LONG).show();
        }
    
        @Override  
        public IBinder onBind(Intent arg0) {  
            return null;  
        }  
    } 
    
    package com.example.newbootservice;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    
    public class MainActivity extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            startService(new Intent(getBaseContext(), AutostartService.class));
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    }
    
    AutostartService.java

    package com.example.newbootservice;
    
    import android.content.BroadcastReceiver;  
    import android.content.Context;  
    import android.content.Intent;    
    
    public class BootCompleteReceiver extends BroadcastReceiver {   
    
    @Override  
    public void onReceive(Context context, Intent intent) {  
    
       Intent service = new Intent(context, AutostartService.class);  
       context.startService(service);   
    
            }  
    
        }
    
    package com.example.newbootservice;
    
    import android.app.Service;  
    import android.content.Intent;  
    import android.os.IBinder;   
    import android.widget.Toast;
    
    public class AutostartService extends Service {  
    
    
        @Override  
        public void onCreate() {  
            super.onCreate();    
        }  
    
        @Override  
        public int onStartCommand(Intent intent, int flags, int startId) {  
    
            Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
            return Service.START_STICKY;  
        }  
    
        @Override
        public void onDestroy() {
    
            super.onDestroy();
            Toast.makeText(this, "Service Destroy", Toast.LENGTH_LONG).show();
        }
    
        @Override  
        public IBinder onBind(Intent arg0) {  
            return null;  
        }  
    } 
    
    package com.example.newbootservice;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    
    public class MainActivity extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            startService(new Intent(getBaseContext(), AutostartService.class));
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    }
    
    MainActivity.java

    package com.example.newbootservice;
    
    import android.content.BroadcastReceiver;  
    import android.content.Context;  
    import android.content.Intent;    
    
    public class BootCompleteReceiver extends BroadcastReceiver {   
    
    @Override  
    public void onReceive(Context context, Intent intent) {  
    
       Intent service = new Intent(context, AutostartService.class);  
       context.startService(service);   
    
            }  
    
        }
    
    package com.example.newbootservice;
    
    import android.app.Service;  
    import android.content.Intent;  
    import android.os.IBinder;   
    import android.widget.Toast;
    
    public class AutostartService extends Service {  
    
    
        @Override  
        public void onCreate() {  
            super.onCreate();    
        }  
    
        @Override  
        public int onStartCommand(Intent intent, int flags, int startId) {  
    
            Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
            return Service.START_STICKY;  
        }  
    
        @Override
        public void onDestroy() {
    
            super.onDestroy();
            Toast.makeText(this, "Service Destroy", Toast.LENGTH_LONG).show();
        }
    
        @Override  
        public IBinder onBind(Intent arg0) {  
            return null;  
        }  
    } 
    
    package com.example.newbootservice;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    
    public class MainActivity extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            startService(new Intent(getBaseContext(), AutostartService.class));
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    }
    
    Manifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.alwaysrunningprocesswithcallanswertap"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.CALL_PHONE" />
    
        <uses-sdk
            android:minSdkVersion="22"
            android:targetSdkVersion="22" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <service android:name="com.example.alwaysrunningprocesswithcallanswertap.CallNotifierService" />
        </application>
    
    </manifest>
    
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.newbootservice"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="15" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
    
            <service android:name=".AutostartService"/>
    
            <receiver android:name=".BootCompleteReceiver">  
                <intent-filter>     
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>  
                    <category android:name="android.intent.category.DEFAULT" />  
                </intent-filter>  
            </receiver>
    
            <activity
                android:name=".MainActivity"
                android:label="@string/title_activity_main" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    
    
    
    对于问题1,您有什么想法吗?如果您需要随时运行,请查看服务并启动前台。如果您可以让您的服务死亡但重新启动,请查看onStartCommand并启动\u STICKY。*如果您可以让您的服务死亡但重新启动,请查看onStartCommand并启动\u STICKY==>我已经在做了。但它并不总是开始??。。这是有条件的吗?