0

我对服务很陌生,所以我在这里遇到了一个小问题。我试图获取前台应用程序名称,我想用 toast 打印出来,但我总是得到一个 runtimeException,我不知道为什么......这是代码:

public class ForegroundAppService extends Service {

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {        
    super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "Foreground service started", Toast.LENGTH_SHORT).show();

    try {
        ActivityManager activityManager = (ActivityManager) 
                    ForegroundAppService.this.getSystemService(ACTIVITY_SERVICE);
        RunningTaskInfo runningTaskInfo = activityManager.getRunningTasks(1).get(0);            
        String foregroundTaskPackageName = 
                    runningTaskInfo.topActivity.getPackageName().toString();
        PackageManager pm = ForegroundAppService.this.getPackageManager();
        PackageInfo foregroundAppPackageInfo;
        foregroundAppPackageInfo = pm.getPackageInfo(foregroundTaskPackageName, 0);
        String foregroundTaskAppName = 
                    foregroundAppPackageInfo.applicationInfo.loadLabel(pm).toString();
        Toast.makeText(this, foregroundTaskAppName, Toast.LENGTH_SHORT).show();
    } catch (NameNotFoundException e) {         
        e.printStackTrace();
    }

    return Service.START_STICKY;
}

}

提前致谢!

4

1 回答 1

0

Android 服务独立存在,没有 Activity。您可以将 Activity 绑定到服务或从 Activity 启动服务。在任何情况下,由于 Service 没有前台 Activity,因此 ActivityManager 不可用并且您会遇到异常。

您可以做的是,查看Intent您在onStartCommand. 您会在此处找到有关意图发送者的一些有限信息。如果您想了解更多信息,可以通过调用 Activity 向 Intent 添加额外信息Intent.putExtra()

如果您想将 Activity 与您的 Service 紧密绑定,请使用bindServiceActivity 方法。您可以在它们之间发送消息。

于 2013-11-03T13:26:32.843 回答