为什么即使不满足条件也会调用应用程序?

时间:2015-10-19 18:00:01

标签: android caching broadcastreceiver sms listener

我开发了这个简单的应用程序,用于收听进入我手机的短信。

正如您在代码中看到的,当SMS到达时,我会扫描其内容以查找特定文本,因此如果不满足此条件,则不会执行任何操作。

真正的问题是,当SMS到达且条件不满足时,创建IF语句以控制何时调用"映射"应用程序是否未执行,但是"映射" app以任一方式调用,并加载与最后一条符合条件的SMS相关的信息。

代码在我的模拟器中与KitKat完美配合,但在我的手机中使用Kitkat 4.4.2正在处理我刚写的行为。

你以前遇到过这样的事吗? 你能告诉我一些解决这个问题的事吗?

这是主要活动

public class MainActivity extends ActionBarActivity {
EditText et_location_data;

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

    Button bt_manual = (Button) findViewById(R.id.bt_manual);
    et_location_data = (EditText) findViewById(R.id.et_location_data);

    bt_manual.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String messageBody = "";

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                messageBody = et_location_data.getText().toString();
                Common_Functions common_functions = new Common_Functions(getBaseContext(), messageBody);
                common_functions.show();
            }
        }
    });
}

@Override
protected void onResume() {
    super.onResume();
    et_location_data.setText("");
}}

这是广播听众

    public class SMS_listener extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())) {
        String messageBody= "";

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {Telephony.Sms.Intents.getMessagesFromIntent(intent)) {SmsMessage smsMessage = Telephony.Sms.Intents.getMessagesFromIntent(intent)[0];
                messageBody = smsMessage.getMessageBody();
            Common_Functions common_functions = new Common_Functions(context, messageBody);
            common_functions.show();
        }
        Log.d("Test", "Message body: " + messageBody);
    }
}}

这是一个用于代码重用的通用类

    public class Common_Functions {
String messageBody= "";
String STR_CODE_LATITUDE = "Latitude";
String STR_CODE_LONGITUDE = "Longitude";
Context context;

String str_Lat = "";
String str_Lon = "";

public Common_Functions(Context context, String messageBody) {
    this.context = context;
    this.messageBody = messageBody;
}

public void show() {
    if (messageBody.toLowerCase().contains("Latitud".toLowerCase())) {
        int i = messageBody.toLowerCase().indexOf(STR_CODE_LATITUDE.toLowerCase());
        int j = messageBody.toLowerCase().indexOf(STR_CODE_LONGITUDE.toLowerCase());

        str_Lat = messageBody.substring(i + 1 + STR_CODE_LATITUDE.length(), i + 1 + STR_CODE_LATITUDE.length() + 10);
        str_Lon = messageBody.substring(j + 1 + STR_CODE_LONGITUDE.length(), j + 1 + STR_CODE_LONGITUDE.length() + 11);

        if (str_Lat.toLowerCase().contains("s"))
            str_Lat = "-" + messageBody.substring(i + 1 + STR_CODE_LATITUDE.length(), i + 1 + STR_CODE_LATITUDE.length() + 9);
        else
            str_Lat = messageBody.substring(i + 1 + STR_CODE_LATITUDE.length(), i + 1 + STR_CODE_LATITUDE.length() + 9);

        if (str_Lon.toLowerCase().contains("w"))
            str_Lon = "-" + messageBody.substring(j + 1 + STR_CODE_LONGITUDE.length(), j + 1 + STR_CODE_LONGITUDE.length() + 10);
        else
            str_Lon = messageBody.substring(j + 1 + STR_CODE_LONGITUDE.length(), j + 1 + STR_CODE_LONGITUDE.length() + 10);

        Intent intent1 = new Intent(android.content.Intent.ACTION_VIEW,
                Uri.parse("http://maps.google.com/maps?q=" + str_Lat + "," + str_Lon));
        context.startActivity(intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

    }
}}

这是清单

<?xml version="1.0" encoding="utf-8"?>

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

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <receiver android:name=".SMS_listener">
        <intent-filter android:priority="200">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

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

1 个答案:

答案 0 :(得分:0)

我发现了这个应用程序遇到的问题。

由于我在完成我在此处发布的最终代码之前已经进行了多次测试,因此我的手机似乎在缓存中存储了一些奇怪的信息,特别是“消息传递”过程。

当我完全卸载应用程序并在此之后向我的手机发送短信时,我意识到了这一点。令人惊讶的是,即使卸载了应用程序,仍然会调用“地图”应用程序。这让我想到了清除“Messaging”进程和Eureka的缓存,问题就解决了。

未来的经验。但是这个行为似乎是我的Android 4.4.2版本的一个大缺陷,因为我无法想象这个操作系统无法管理这种威胁。