【问题标题】:Check if application is running (either background or foreground) Android检查应用程序是否正在运行(后台或前台)Android
【发布时间】:2015-01-07 16:22:15
【问题描述】:

我为 SMS 创建了一个 BroadCastReceiver,我希望它仅在应用程序运行时工作(在前台或后台)。我当前使用的代码是:

public class BroadCastReceiver extends BroadcastReceiver 
{

    public void onReceive(Context context, Intent intent)
    {

        ActivityManager am = (ActivityManager) context
                .getSystemService(Activity.ACTIVITY_SERVICE);
        String packageName = am.getRunningTasks(1).get(0).topActivity
                .getPackageName();

    if(packageName.contains("com.example.sms") )
     {
        abortBroadcast();

     }else
     {

      }

     }
    }

但问题是这段代码只能在前台工作,所以当用户点击返回按钮或主页按钮时,应用程序将在后台工作,但 BroadCastReceiver 将无法工作。那么有什么方法可以解决这个问题吗??在此先感谢(&)

【问题讨论】:

  • getRunningTasks 自 Lollipop 以来已被弃用。它只会返回您自己的应用程序的任务。此外,它从一开始就从未打算用于生产代码。
  • 我知道,但我还没有找到任何替代品。我目前正在尝试使用 RunningAppProcessInfo 。这也只能用于调试,但我认为在这种情况下我别无选择。
  • 等等。我认为您发布的代码与您在第一句话中所说的不一致。您希望广播仅在您的应用运行时运行还是在另一个应用运行时运行?
  • 仅当我的APP运行时。

标签: android


【解决方案1】:

如果您只想在应用运行时运行广播,则只需在应用运行时注册广播即可。

public class BroadCastReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        /** SMS received while app was running. Do whatever */
    }
}

public class MainActivity extends Activity {

  private BroadCastReceiver mBroadcastReceiver = new BroadCastReceiver();

  @Override
  public void onStart() {
    super.onStart();
    registerReceiver(myBroadcastReciever, new IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION);
  }

  @Override
  public void onStop() {
    super.onStop();
    unregisterReceiver(myBroadcastReceiver);
  }
}

广播接收器只会在您的应用运行时接收广播。无需检查正在运行的进程。如果您只想在应用对用户可见时接收广播,则可以将它们移动到 onResume()/onPause()。如果您想尽快开始接收广播,您可以(取消)注册 onCreate()/onDestroy()。您可以在 Service 中使用其各自的回调执行相同的操作。

【讨论】:

  • 感谢您的回答。在我的代码中,我没有在 MainActivity 中调用 BroadCastReceiver ,也没有传递 intent extras 。所以实际上我的 MainActivity 类文件与 BroadCastReceiver 类没有任何关系,当我启动应用程序时,接收器会自动启动。所以在我的情况下,你认为我只能在 MainActivity 类调用时让它工作吗?顺便说一句,这是我的整个应用程序的代码(更新后的 BroadCastReceiver 是问题的答案):
  • 对于那些愚蠢的问题,我深表歉意,我对 java 的世界还是很陌生
  • 是的。 BroadcastReceiver 没有什么特别之处。这是一堂课。您在 MainActivity 中导入该类,分配一个引用,然后通过“registerReceiver”将引用提供给 Android 系统。系统需要知道您的接收器的存在才能向其发送广播。在 Manifest 中注册它可以确保它总是被调用。在你的 Activity 中注册它可以确保它只在你的应用运行时被调用。
  • 您不必在 Manifest 中注册接收者。仅当您希望接收器在无论您的应用程序是否正在运行时都接收广播时才需要这样做。在这种情况下,这不是您要寻找的。​​span>
【解决方案2】:

你可以运行 ps 并检查你的包名的输出

try {
    Process process = Runtime.getRuntime().exec("ps | grep \""+myPackageName+"\"");

    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    int bytes;
    char[] buffer = new char[4096];
    StringBuffer output = new StringBuffer();
    while ((bytes = reader.read(buffer)) > 0) {
        output.append(buffer, 0, bytes);
    }
    reader.close();
    process.waitFor();

    return output.toString().length()>1;
} catch (Exception e) {
}

【讨论】:

  • 我得到错误返回 output.toString().length()>1;这是 Void 方法不能返回值
  • 我已将其更改为 if (output.toString().length()>1){ abortBroadcast(); ..会尝试并回应
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 2015-06-18
相关资源
最近更新 更多