2

我正在构建一个小应用程序,它现在可以很好地与服务和活动配合使用。

虽然,我试图在登录时将一些静态信息(比如服务是否已经启动?)保存到静态布尔值 isRunning 中。它会在 onCreate() 时设置为 true,但是当我稍后从活动中调用它时,它总是返回 false。

从服务:

public static boolean isRunning = false;

public void onCreate() {
        super.onCreate();
    isRunning = true;
}

有谁知道为什么这不起作用?我尝试使用一些日志来弄清楚发生了什么,但我似乎无法弄清楚。

从活动

public void onResume() {
        super.onResume();
        if(mIsBound) {
            Log.i(LOG_TAG, "Resuming: Service is running");
            if(Service.isRunning) {
                Log.e(LOG_TAG, "SERVICE IS RUNNING!");
            } else {
                Log.e(LOG_TAG, "SERVICE IS NOT RUNNING!");
            }
        } else {
            Log.i(LOG_TAG, "Resuming: Service NOT running");
        }
        StopCheck.setChecked(mIsBound);
    }

mIsBound 是由活动创建以绑定到服务的(我希望它重新绑定,但这似乎是不可能的),并且它在当前状态下是可靠的。但不是在该活动之外,这就是我想要使用静态变量的目的。如果 mIsBound 等于 true,Service.isRunning 应该返回 true。然而,我日志中那个小测试的结果是“正在恢复:服务正在运行”,然后是“服务未运行”。

任何建议或问题都非常感谢。

根据要求:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.somnu.ServiceTest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="7" />

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".Login"
            android:debuggable="true"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Activity"
            android:debuggable="true"
            android:label="@string/app_name" >
        </activity>

        <service
            android:name=".Service"
            android:process=":Service" >
        </service>

    </application>

</manifest>
4

1 回答 1

2

删除android:process

运行服务的进程的名称。通常,应用程序的所有组件都在为应用程序创建的默认进程中运行。它与应用程序包同名。元素的 process 属性可以为所有组件设置不同的默认值。但是组件可以使用自己的进程属性覆盖默认值,从而允许您将应用程序分布在多个进程中。

If the name assigned to this attribute begins with a colon (':'), a new process, private to the application, is created when it's needed and the service runs in that process. If the process name begins with a lowercase character, the service will run in a global process of that name, provided that it has permission to do so. This allows components in different applications to share a process, reducing resource usage. 
于 2012-09-14T12:53:54.743 回答