我正在开发一个Android应用程序。在我的应用程序中,我需要检测传入的SMS。 我试过一个带广播接收器的示例。但广播接收器的问题是,即使您的应用程序没有运行,它也能检测到短信。我的要求是在应用程序运行时检测短信。
提前致谢。
答案 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 )
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();
}
如果你想实现这个方法,你还需要做更多的工作:
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,则执行逻辑,否则不执行任何操作。