2013-10-01 38 views
0

我想创建一个应用程序来监视用户呼叫(传出/传入)和短信(传入)。关于BroadcastReceivers的几个问题:

所以我创建了3个广播接收机:

IncomingCallReceiver

public class IncomingCallReceiver extends BroadcastReceiver 
{ 
@Override 
public void onReceive(Context context, Intent intent) 
{ 
    MyPhoneStateListener phoneListener = new MyPhoneStateListener(context); 
    TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
    telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
} 

}

OutgoingCallReceiver

public class OutgoingCallReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 
     Log.d("DEBUG", "RINGING (outgoing call) with number: " + number); 
     Toast.makeText(context, "Outgoing call number: " + number, Toast.LENGTH_LONG).show(); 
    } 
} 

IncomingSmsReceiver

public class IncomingSmsReceiver extends BroadcastReceiver 
{ 
    final SmsManager sms = SmsManager.getDefault(); 

    @Override 
    public void onReceive(Context context, Intent intent) { 
    // Retrieves a map of extended data from the intent. 
    final Bundle bundle = intent.getExtras(); 

    try 
    { 
     if (bundle != null) 
     { 
      final Object[] pdusObj = (Object[]) bundle.get("pdus"); 
      for (int i = 0; i < pdusObj.length; i++) 
      { 
       SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]); 
       String phoneNumber = currentMessage.getDisplayOriginatingAddress(); 
       String senderNum = phoneNumber; 
       String message = currentMessage.getDisplayMessageBody(); 

       Log.i("SmsReceiver", "senderNum: " + senderNum + "; message: " + message); 
       Toast.makeText(context, "senderNum: " + senderNum + ", message: " + message, Toast.LENGTH_LONG).show(); 
      } 
     } 
     // bundle is null 
    } 
    catch (Exception e) 
    { 
     Log.e("SmsReceiver", "Exception smsReceiver" + e); 
    } 
} 
} 

,并定义它们的所有IM我的清单文件:

<receiver android:name=".IncomingSmsReceiver" > 
     <intent-filter> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

    <receiver android:name=".IncomingCallReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
    </receiver> 

    <receiver android:name=".OutgoingCallReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.ACTION_NEW_OUTGOING_CALL" /> 
     </intent-filter> 
    </receiver> 

这一切伟大的工作,但现在我有一些问题,我需要一些指针:

1。如果我在清单文件中以这种方式定义BroadcastReceivers,那么纠正我,如果我错了,但如果我的应用程序已关闭/杀死,那么我将不会继续监视这些操作,对?

2.什么利兹我认为我需要创建一个Service将运行/注册这些BroadcastReceivers,所以我创建了以下Service

CallAndSMSDetectService

public class CallAndSMSDetectService extends Service { 

IncomingCallReceiver incomingCallReceiver; 
OutgoingCallReceiver outgoingCallReceiver; 
IncomingSmsReceiver incomingSmsReceiver; 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    int res = super.onStartCommand(intent, flags, startId); 

    outgoingCallReceiver = new OutgoingCallReceiver(); 
    incomingCallReceiver = new IncomingCallReceiver(); 
    incomingSmsReceiver = new IncomingSmsReceiver(); 

    IntentFilter outgoingCallIntentFilter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL); 
    registerReceiver(outgoingCallReceiver, outgoingCallIntentFilter); 

    return res; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 

    unregisterReceiver(outgoingCallReceiver); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    // not supporting binding 
    return null; 
} 
} 

我这里的问题是,我找不到合适的IntentFilters SMS_RECEIVEDPHONE_STATE,所以我不知道如何注册他们progra像我对Intent.ACTION_NEW_OUTGOING_CALL一样。

我会很高兴,如果有人可以告诉我在这一个正确的方向?以及它应该如何正确完成。

谢谢。

+0

你不需要服务注销接收者我认为问题可以在清单文件中的权限你有没有添加这个 DjHacktorReborn

+0

我没有创建服务为了注销接收者,我已经创建了它,以便即使我的应用程序被系统杀死(当它不在前台时),显示器也将继续运行。因为据我所知如果我使用清单文件注册接收者,他们将在我的应用程序被杀后立即停止接收广播。 –

回答

0

其实,你完全正确的。当你的应用程序启动时,你需要创建服务。无需创建实例

IncomingCallReceiver incomingCallReceiver;

OutgoingCallReceiver outgoingCallReceiver;

IncomingSmsReceiver incomingSmsReceiver;

尝试清单优先接收器设定。

<receiver android:name=".OutgoingCallReceiver"> 
      <intent-filter android:priority="2147483647"> 
       <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> 
      </intent-filter> 
</receiver> 

希望我帮了你。如果你有问题 - 问我。

+0

但是,如果我使用Manifest文件注册我的接收器(如您提供的代码段所示),当我的应用程序被终止时,它们将停止接收。所以我需要使用“registerReceiver”方法使用服务中的代码。 –

+0

如果您的服务始终保持活跃,接收方将收到活动,但前提是服务不会被破坏! –

+0

是的,我明白了,当我的应用程序不在前面时,服务仍然会比平时长。 –

0

您可以创建粘性服务以保持广播可用。由此你可以确定,即使你关闭了或者杀死了你的应用程序,你的广播也一直在运行。

+0

这与创建标准/简单服务有什么不同? –

+0

这是绑定到活动,而绑定到粘性服务将保持广播一直活着 – Basbous

+0

但为此我需要注册服务中的所有三个接收器,对吧? –