如何在android中运行应用程序时检测SMS?

时间:2014-10-20 07:45:18

标签: android

我正在开发一个Android应用程序。在我的应用程序中,我需要检测传入的SMS。 我试过一个带广播接收器的示例。但广播接收器的问题是,即使您的应用程序没有运行,它也能检测到短信。我的要求是在应用程序运行时检测短信。

提前致谢。

3 个答案:

答案 0 :(得分:0)

没有简单的方法来跟踪您的应用是否对用户可见。您必须自己跟踪它,只需在进入onResume()和onPause()时计算屏幕。当应用程序命中任何活动的onResume()时,增加一个计数器,当命中onPause()时减少。您只需创建一个基本活动并将这些计数系统放入其中,并从您在应用程序中创建的每个活动中扩展它。

查看Android活动生命周期。

http://developer.android.com/reference/android/app/Activity.html

答案 1 :(得分:0)

试试这个!!

您的广播接收者必须指定android:exported =“false”才能接收在您自己的应用程序之外创建的广播。

Sample广播接收器在清单中定义如下:

<receiver
    android:name=".IncomingSmsBroadcastReceiver"
    android:enabled="true"
    android:exported="false" >
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

答案 2 :(得分:0)

您的问题有两种解决方案: See This for refernce

1.通过注册动态广播接收器:

public class MyReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
      // Do your sms receive logic here    
  }
} 

并在您的活动中注册此接收器,如下所示:

 // Global
 BroadcastReceiver smsReceiver = new MyReceiver();

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    registerReceiver(smsReceiver , new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    unregisterReceiver(smsReceiver);        
    super.onPause();
}

2.通过检查您的应用程序是否在静态广播接收器中运行:

如果你想实现这个方法,你还需要做更多的工作:

a)在Manifest中添加“android.permission.GET_TASKS”权限

b)在做任何事情之前,在广播接收者的onReceive()方法中调用此方法

public boolean checkRunningApps() {
    ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> runningTasks = mActivityManager
            .getRunningTasks(Integer.MAX_VALUE);

    int pos = -1;

    // Checking that your app is in running task list or not
    for (int i = 0; i < runningTasks.size(); i++) {
        if ((runningTasks.get(i).topActivity.getPackageName()
                .contains(AppSettings.REQUIRED_PACKAGENAME))) {
            isAppRunning = true;
            pos = i;
            break;
        }
    }

    if (pos == -1) {
        // App is not running, do nothing
        return false;
    }

    if (pos >= 0) {
        // App is running, do your logic here
        // If you want to check that app is on top, check for only 0 position of runningTasks arrayList
        return true;
    }

    return false;
}
  

如果此方法返回 true,则执行逻辑,否则不执行任何操作