用于收听电话的Android服务不会持续运行

时间:2018-04-01 05:25:53

标签: android service

我有 Service ,可以同时收听来电和来电。 Service 会在应用启动时运行并继续运行甚至在应用程序关闭后的一段时间内。但不知何故 Service 被销毁或稍后出现。我已将 START_STICKY 作为回报 startCommand() 方法。我知道当内存很高时,系统会杀死服务。但是,如果呼叫录音应用程序能够连续收听来电?有没有解决方法?这种问题?如何让我的应用程序不断收听电话?

代码

PhoneListenerService.class

public class PhoneListenerService extends Service{
    private TelephonyManager telephonyManager;
    private File file;
     OutgoingReceiver outgoingReceiver;
    @Override
    public void onCreate()
    {
        super.onCreate();
        outgoingReceiver=new OutgoingReceiver();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("android.intent.action.NEW_OUTGOING_CALL");
        registerReceiver(outgoingReceiver,intentFilter);
        file=new File(Environment.getExternalStorageDirectory().getAbsolutePath());
        telephonyManager=(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        file=new File(Environment.getExternalStorageDirectory(),"AutoCall");
        if (!file.exists())
        {
            Log.e("File","Created");
            file.mkdir();
        }
        else
        {
            Log.e("File",file.getPath());
        }
        telephonyManager.listen(new TeleListener(getApplicationContext(),file.getAbsolutePath()),PhoneStateListener.LISTEN_CALL_STATE);
        Log.e("Oncreate","Service");

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Log.e("OnCommand","Service");
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(outgoingReceiver);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    public class OutgoingReceiver extends BroadcastReceiver {
        public OutgoingReceiver()
        {

        }
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.e("Out","Track");
            String phone_number=intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            Toast.makeText(context,"Outgoing call identified",Toast.LENGTH_SHORT).show();
        }
    }
}

3 个答案:

答案 0 :(得分:0)

像这样的

以FOREGROUND服务启动服务
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Register your reporting alarms here.
    Log.e("SmsAndCallService", "IN onStartCommand");

    startForeground(105, getCompatNotification());
    return Service.START_STICKY;
}

private Notification getCompatNotification() {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "105");
    builder.setSmallIcon(R.mipmap.ic_launcher).setContentTitle(getString(R.string.app_name) + " running").setTicker("Recording");
    Intent intent = new Intent(new Intent(getApplicationContext(), SplashActivity.class));
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 2003, intent, 0);
    builder.setContentIntent(pendingIntent);
    Notification notification = builder.build();
    return notification;
}

因此,当系统资源耗尽时,系统无法终止此服务。 `

FOREGROUND SERVICE意味着某种通知内容会一直显示,以使系统知道服务仍在运行。

答案 1 :(得分:0)

使用静态系统定义广播接收器来接听来电。但是忘了在清单中声明这个

答案 2 :(得分:0)

  

是的。我使用MediaRecorder。我有一个问题。如果重新启动,那么服务和接收器仍然会在后台运行

就像这样你需要有重新启动服务的广播接收器和更高版本的jobcheduler而不是marshmallow Android 6.0

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
            Intent iService = new Intent(context, PhotoService.class);
            context.startService(iService);
        } else
            JobInfoServ.scheduleJob(context);
    }
}

的AndroidManifest.xml

<receiver
    android:name="com.your.package.broadcast.BootReceiver"
    android:enabled="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>