MyApplication的方法返回错误的值

时间:2014-07-24 01:13:04

标签: java android

我有一个像这样的Application类:

public class MyApplication extends Application {
    private static boolean FOCUSED;

    public static boolean isAppFocused() {
        Log.v("@@@@@@  isAppFocused", "called");
        return FOCUSED;
    }  

    public static void appResumed() {
        Log.v("@@@@@@  appResumed", "called");
        FOCUSED = true;
    }

    public static void appPaused() {
        Log.v("@@@@@@  appPaused", "called");
        FOCUSED = false;
    }  
}

在我的MainActivity中,我正在调用它的方法:

@Override
protected void onResume() {
    super.onResume();
    MyApplication.appResumed();
}

@Override
protected void onPause() {
    super.onPause();
    MyApplication.appResumed();
}

如您所见,我从未调用过MyApplication.appPaused();方法。 并且MyApplication中的FOCUSED变量的默认值为null。

奇怪的是,当我在服务中调用isAppFocused()时,它返回false !!!!!

我想知道该应用是否专注,以便它不会在服务中显示通知。 我甚至在此之前使用过SharedPreferences,并且有同样的问题,无论如何,它们的价值都不会是我期望的那个。 :|

我不知道为什么它不希望我知道app是否有焦点。 :|我很生气。

修改 我将Application类更改为:

public class MyApplication extends Application {
    private static String FOCUSED;

    public static String isAppFocused() {
        Log.v("@@@@@@  isAppFocused", "called");
        return FOCUSED;
    }  

    public static void appResumed() {
        Log.v("@@@@@@  appResumed", "called");
        FOCUSED = "true";
    }

    public static void appPaused() {
        Log.v("@@@@@@  appPaused", "called");
        FOCUSED = "false";
    }  
}

现在在服务中我正在使用它:

if(MyApplication.isAppFocused().equals("false")){
  //show notifications
}

现在它抛出NullPointerException,但我在logcat中看到在调用isAppFocused()之前调用了两次appResumed()方法。

AndroidManifest.xml中的

<application
    android:allowBackup="false"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:uiOptions="splitActionBarWhenNarrow" android:supportsRtl="true">



    <!-- Splash screen -->
    <activity
        android:name="com.example.SplashScreen"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Black.NoTitleBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <!-- Main activity -->
    <activity
        android:name="com.example.MainActivity"
        android:configChanges="orientation|screenSize|keyboardHidden"
        android:launchMode="singleTask"
        android:label="@string/app_name" >
    </activity>

    <!-- Login activity -->
    <activity 
        android:name="com.example.Login"
        android:screenOrientation="portrait">
    </activity>

    <!-- Push Service -->
    <receiver android:name="com.example.service.MyBroadcast" 
              android:enabled="true" 
              android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>
    <service android:name="com.example.service.MyService"
             android:process=":My_Service_Process"
        />

</application>
<application
    android:name="com.example.MyApplication" >

</application>

编辑2: 我在MainActivity中改变了:

@Override
protected void onResume() {
    super.onResume();
    MyApplication.appResumed();
    Log.v("**** isAppFocused", MyApplication.isAppFocused());  
}

@Override
protected void onPause() {
    super.onPause();
    MyApplication.appPaused();
    Log.v("**** isAppFocused", MyApplication.isAppFocused());  
}

结果是正确的,onResume返回“true”,onPause返回“false”。 但是在服务中它总是返回默认值“true”; 我不知道为什么它在MainActivity中发生了变化,但它并没有改变服务内部。

Application类的愤怒版本:

public class MyApplication extends Application {
    private static String FOCUSED = "true";

    public static String isAppFocused() {
        Log.v("@@@@@@  isAppFocused", "called");
        return FOCUSED;
    }  

    public static void appResumed() {
        Log.v("@@@@@@  appResumed", "called");
        FOCUSED = "true";
    }

    public static void appPaused() {
        Log.v("@@@@@@  appPaused", "called");
        FOCUSED = "false";
    }  
} 

1 个答案:

答案 0 :(得分:1)

根据Within an application, will the activity and service run in the same process?,您的服务和活动在不同的流程中运行。这意味着您的活动对任何变量所做的任何更改都不会对服务可见。您需要找到另一种在服务和活动之间进行通信的方式。有关建议,请参阅Communication between Service and Activity on Android