私のキャリア(私はベネズエラに住んでいます)はいつも私にSMSを送信しています、そのうちのいくつかはうんざりです、私は気にしています、私は本当に市場からSMSアプリをダウンロードしたくありません非常に具体的かつ簡単な何かをしているからです。Android。
基本的な考え方:私は、OSにうまくいくために、SMSの意図をキャプチャするBroadcastReceiver
を持っています。私はここで何も処理しません。(私は思うように複雑なルールを作りたいと思っています。 DBや他の非同期タスク(BroadcastReceiver
で実行できない)を使用している場合は、SMSを処理するIntentService
に同じバンドルを送信します。
これは一般的に問題なく動作します。システム通知にSMSがあり、SMSが完全に処理されないようにするには、ブロードキャストを停止できます。IntentService
は問題:
私はサービスにSMSを処理した後、私はSMSを持って気づくようにシステムを望んでいた天気をかを決定するにはどうすればよいですか?
私は強くBroadcastReceiver
内部procesingを行うことを避けるためにしたいと思います。 (This has important repercussions to what you can do in an onReceive(Context, Intent) implementation: anything that requires asynchronous operation is not available, because you will need to return from the function to handle the asynchronous operation, but at that point the BroadcastReceiver is no longer active and thus the system is free to kill its process before the asynchronous operation completes.)
私はSMSを処理していましたが、私の基準に合致しなかった場合は、SMS Reciveブロードキャストをバンドルに追加して再度確認することができました。しかし、私はこれを動作させることはできません。
コード:
public class SmsReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if(!intent.getExtras().getBoolean("previouslyChecked",false)){
this.abortBroadcast();
Intent serviceIntent = new Intent(context, SmsRecievedServices.class);
serviceIntent.putExtras(intent);
context.startService(serviceIntent);
}
}
}
public class SmsRecievedServices extends IntentService {
public SmsRecievedServices() {
super("SmsRecievedServices");
}
@Override
protected void onHandleIntent(Intent intent) {
Bundle bundle = intent.getExtras();
if(!smsMatchesCriteria(bundle)){
Intent intent2 = new Intent("android.provider.Telephony.SMS_RECEIVED");
bundle.putBoolean("previouslyChecked",true);
intent2.putExtras(bundle);
sendOrderedBroadcast(intent2,"android.permission.RECEIVE_SMS");
}
}
}
ブロードキャストレシーバは意図を取得し、放送を中止doesntのが、システムがSMSで拾うのdoesnt。何か案は?
編集(ブランデルさんのコメントに応答して):
私は多分私が余分を追加すると、それを台無しにするという事実について考え、私は次のことを試してみました:
public class SmsReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
int randomNum = (int)Math.ceil(Math.random()*100);
if(randomNum > 20){
this.abortBroadcast();
Intent serviceIntent = new Intent(context, SmsRecievedServices.class);
serviceIntent.putExtras(intent);
context.startService(serviceIntent);
}
}
}
public class SmsRecievedServices extends IntentService {
public SmsRecievedServices() {
super("SmsRecievedServices");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.i("SMSManager","Forwarding intent");
Bundle bundle = intent.getExtras();
Intent intent2 = new Intent("android.provider.Telephony.SMS_RECEIVED");
intent2.putExtras(bundle);
sendOrderedBroadcast(intent2, "android.permission.RECEIVE_SMS");
}
}
LogCat出力は次のようになります。
02-10 22:06:24.632: I/SMSManager(424): RandomNumber: 74
02-10 22:06:24.673: I/SMSManager(424): Forwarding intent
02-10 22:06:24.683: I/SMSManager(424): RandomNumber: 64
02-10 22:06:24.803: I/SMSManager(424): Forwarding intent
02-10 22:06:24.824: I/SMSManager(424): RandomNumber: 28
02-10 22:06:24.832: I/SMSManager(424): Forwarding intent
02-10 22:06:24.854: I/SMSManager(424): RandomNumber: 14
ご覧のとおり、メッセージはシステムから3回隠されていました.4回目は、randomNumberが20よりも小さいので、中止の呼び出しを呼び出さないようにしました。受信トレイや通知バーに新しいSMSを表示しないでください。
添付ファイルなしで 'sendOrderedBroadcast()'を試したことがありますか?また、SMSのために作成していないインテントを既に追加して追加する必要があるかどうかを確認しました。 – Blundell
あなたのコメントに答えるために私の質問を編集しました。私が最初に得たのと全く同じ意図を再送しているので、ランダムな条件が満たされたときに新しいSMSとして表示されると思っていました。 – blindstuff
現時点での問題は、転送の意図がない、つまり通知に新しいSMSがないことです。 – Blundell