我希望在收到短信时对Toast进行敬酒。意图过滤器不会以编程方式取消注册
我试图明确地将意图过滤器放在清单中,我除了在应用程序被杀时不想调用它时,我部分成功了,所以在这里一些程序员的建议下,我尝试了播放接收器通过在我的用户界面中放置两个按钮编程式,即register
和unregister
,因此它们的唯一目的是注册和取消注册广播接收器。
我的主要目标是运行广播接收器,即使应用程序是背景(满足条件,用户按下了注册表,并在使用其他应用程序之后)。
我一直在使用这个教程:http://www.javacodegeeks.com/2012/09/android-broadcast-receiver.html,但基本上用sms接收器修改它。
这里是我的代码:
package gates.apps.automaticmessageresponder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
public class MainActivity extends Activity {
SmsReceiver broadcastReceiver=new SmsReceiver();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void register(View view){
this.registerReceiver(broadcastReceiver, new IntentFilter(
"android.provider.Telephony.SMS_RECEIVED"));
Log.e("register","pressed");
}
public void unRegister(View view){
this.unregisterReceiver(broadcastReceiver);
Log.e("unregister","pressed");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
而其他类
package gates.apps.automaticmessageresponder;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
public class SmsReceiver extends BroadcastReceiver {
// Get the object of SmsManager
final SmsManager sms = SmsManager.getDefault();
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
// 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);
// Show alert
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context, "senderNum: "+ senderNum + ", message: " + message, duration);
toast.show();
} // end for loop
} // bundle is null
} catch (Exception e) {
Log.e("SmsReceiver", "Exception smsReceiver" +e);
}
}
}
我没有修改清单文件,除了我添加了允许接收短信。 即使我在日志中,注册按下和unpressressed。我认为问题在于寄存器接收器按钮被调用,即使没有点击,是一种不正常的行为?或者我的看法是错误的?
我认为这是正确的答案。这就是为什么我使用单例注册和注销'BroadcastReceiver's并检查它们是否被注册,以避免创建新的实例,当这不是你想要的。 – slinden77
@WindsurferOak:OK你提到的问题似乎有潜力,但即使它不在onResume()中,我的应用程序也会被调用,而且我不必按下注册按钮 –