Android 在onReceive之后保持BroadcastReceiver活动
我有CallReceiver扩展了BroadcastReceiver类,该类通过MediaRecorder实例记录电话呼叫。问题是每次我的服务接收到意图时,都会使用Unitized recorder创建一个新的PhoneCallReceiver实例。因此我无法停止记录。当然,我可以将recorder实例存储在静态变量中,但这是脏的黑客。我相信一定有办法保持服务的活力 这是我的接收机等级:Android 在onReceive之后保持BroadcastReceiver活动,android,broadcastreceiver,Android,Broadcastreceiver,我有CallReceiver扩展了BroadcastReceiver类,该类通过MediaRecorder实例记录电话呼叫。问题是每次我的服务接收到意图时,都会使用Unitized recorder创建一个新的PhoneCallReceiver实例。因此我无法停止记录。当然,我可以将recorder实例存储在静态变量中,但这是脏的黑客。我相信一定有办法保持服务的活力 这是我的接收机等级: public class CallReceiver extends PhoneCallReceiver {
public class CallReceiver extends PhoneCallReceiver {
private static VoiceRecorder recorder; // VoiceRecorder stores MediaRecorder instance
@Override
protected void onIncomingCallReceived(Context ctx, String number, Date start)
{
Log.d("phone","onIncomingCallReceived");
}
@Override
protected void onIncomingCallAnswered(Context ctx, String number, Date start)
{
Log.d("phone","onIncomingCallAnswered");
MainActivity.recorder=new VoiceRecorder("incoming_"+number);
try {
MainActivity.recorder.start();
} catch (IOException e) {
Log.d("phone error",e.getLocalizedMessage());
e.printStackTrace();
}
}
@Override
protected void onIncomingCallEnded(Context ctx, String number, Date start, Date end)
{
Log.d("phone","onIncomingCallEnded");
if (MainActivity.recorder!=null) {
try {
MainActivity.recorder.stop();
} catch (Exception e) {
Log.d("phone record error",e.getLocalizedMessage());
e.printStackTrace();
}
MainActivity.recorder=null;
}
}
@Override
protected void onOutgoingCallStarted(Context ctx, String number, Date start)
{
Log.d("phone","onOutgoingCallStarted "+MainActivity.recorder);
MainActivity.recorder=new VoiceRecorder("outgoing_"+number);
try {
MainActivity.recorder.start();
} catch (IOException e) {
Log.d("phone error",e.getLocalizedMessage());
e.printStackTrace();
}
}
@Override
protected void onOutgoingCallEnded(Context ctx, String number, Date start, Date end)
{
Log.d("phone","onOutgoingCallEnded "+MainActivity.recorder);
if (MainActivity.recorder!=null) {
try {
MainActivity.recorder.stop();
} catch (IOException e) {
e.printStackTrace();
}
MainActivity.recorder=null;
}
}
@Override
protected void onMissedCall(Context ctx, String number, Date start)
{
Log.d("phone","onMissedCall");
}
}
您的PhoneCallReceiver不应具有MediaRecorder。它应该委托给具有MediaRecorder的前台服务。服务可以保持稳定。通过比较,清单中注册的BroadcastReceiver仅用于一个onReceive呼叫。您的PhoneCallReceiver不应具有MediaRecorder。它应该委托给具有MediaRecorder的前台服务。除此之外,您可能还想用一个说明您的问题的图标来编辑您的问题。@Commonware so静态变量在这种情况下可以吗?PS:更新了postso静态变量在这种情况下可以吗?-不。这是我的服务类-看起来不是服务。它似乎是一个广播接收器。@Commonware Thank不知道前台服务。它工作得很好!你能把你的评论作为一个答案,让我接受吗?