2016-09-20 78 views
0

我有一些问题与使用BroadCastReceiver.Here而来的AndroidManifest.xml中无法实例接收器没有零参数的构造函数

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.zhang.notificationtest"> 

    <uses-permission android:name="android.permission.RECEIVE_SMS"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".NotificationActivity"></activity> 
     <receiver android:name=".NotificationActivity$SMSReceiver"> 
      <intent-filter> 
       <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 

和我的代码部分

公共类NotificationActivity扩展AppCompatActivity {

public TextView textViewFrom, textViewContent; 
public IntentFilter intentFilter; 
public SMSReceiver smsReceiver; 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    unregisterReceiver(smsReceiver); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_notification); 

    textViewContent = (TextView)findViewById(R.id.textViewContent); 
    textViewFrom = (TextView)findViewById(R.id.textViewFrom); 

    intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); 
    smsReceiver = new SMSReceiver(); 

    registerReceiver(smsReceiver,intentFilter); 
} 

public class SMSReceiver extends BroadcastReceiver{ 

    public SMSReceiver(){ 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle bundle = intent.getExtras(); 
     Object[] pdus = (Object[]) bundle.get("pdus"); 
     SmsMessage[] smsMessages = new SmsMessage[pdus.length]; 
     for (int i = 0; i < smsMessages.length; i++) 
      smsMessages[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 
     String from = smsMessages[0].getOriginatingAddress(); 
     StringBuilder content = new StringBuilder(""); 
     for (SmsMessage element: smsMessages) 
      content.append(element.getMessageBody()); 
     textViewFrom.setText(from); 
     textViewContent.setText(content.toString()); 
    } 
} 

} 任何人都可以给我一些帮助,告诉我为什么发生了?非常感谢!

回答

2

您的SMSReceiver是一个非静态实例类。这意味着它只能在持有类NotificationActivity的环境中构建。这很好,但是您无法在清单中注册它,因为系统需要构建一个NotificationActivity以便实例化您的接收器来处理广播。

顺便说一句,要么将接收器注册到清单中,要么将其注册到您的活动中,但不能同时在两者中注册。

+0

感谢您的帮助和解释!很好的帮助! Wooo! –

3

SMSReceiver是一个非静态的内部类,如果要将接收器保留在清单中,请将其设置为静态或将其移出NotificationActivity

当您添加BroadcastReciever到清单,您声明,它始终是注册(所以你不需要注册,并在您的活动注销)

如果你想保持它在清单,Activity和BroadcastReceiver的生命周期不同,因此按照您目前的做法访问textViewFrom会很危险。

如果您希望只在活动处于活动状态时触发接收器,请将其从清单中删除

+0

Wooo!它确实有用!我应该更深入地去更好地理解这门课。再次感谢〜 –

相关问题