该应用程序中有三个主要类
1)Intent服务:在此处,我接收推送通知并根据通知信息和其他两个类的行为打开活动。以下是执行此操作的代码:
if(Global.isMainScreenRunning){
Intent intent = new Intent(this, MainScreen.class);
intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} else if(!Global.NotificationScreenRunning){
Intent intent = new Intent(this, NotificationScreen.class);
intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
2) NotificationScreen:这是中介屏幕,如果应用程序未运行,则首先显示此屏幕,并且在单击此屏幕的“是”按钮时将打开 MainScreen 并完成此屏幕。
3) Main screen: 这是应用程序的主屏幕,显示地图。其核心行为是 menifest 文件中提到的 launchmode="singletask"
,这意味着如果此屏幕正在运行,则其全部数据将发送到 onNewIntent()
方法,而不是再次打开此屏幕。
现在流程中正在发生什么
步骤1:应用程序在后台运行并收到推送通知。条件满足,第二个条件成功,并发出通知屏幕意图
步骤2:在通知屏幕上,我单击 ye 按钮以移动到下一个主屏幕
步骤3:在主屏幕上,我处理此信息并执行任务或仅关闭应用程序
步骤4:再次接收到新的通知,由于应用程序未运行,因此进入第二个条件并启动通知屏幕的意图,但是这次没有启动通知屏幕,而是提供了其意图并启动了错误的主屏幕。
这是我面临的异常行为,即错误地启动了主屏幕而不是提供通知屏幕类的意图,这与 Android 的应用程序完全不同。
非常感谢任何遇到此类问题的人的帮助。
编辑
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.front" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.microphone" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.example.app.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.app.permission.C2D_MESSAGE" />
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:xlargeScreens="true" />
<application
android:allowBackup="true"
android:icon="@drawable/android_app_icon"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".SplashScreen"
android:configChanges="keyboardHidden|orientation"
android:label="@string/app_name"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainScreen"
android:configChanges="keyboardHidden|orientation"
android:launchMode="singleTask"
android:excludeFromRecents="true"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".NotificationScreen"
android:configChanges="keyboardHidden|orientation"
android:excludeFromRecents="true"
android:screenOrientation="portrait" >
</activity>
<receiver
android:name=".pushnotification.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.selebrety.app" />
</intent-filter>
</receiver>
<service android:name=".pushnotification.GcmIntentService" />
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
</application>
</manifest>
第二次编辑
我正在测试的手机是"YU Yureka",这里是它的规格链接。目前它有android 5.0.2操作系统。
第三次编辑
为了测试这个行为,我从eclipse调试器中调试了代码。为了检查这个问题,我在NotificationScreen
的onResume
和onCreate
中设置了断点,但是它们从未被命中,而是命中了MainScreen
的onResume
。
我还在if和else条件中添加了日志,但仍会输出else条件的日志。
第四次编辑
Global.isMainScreenRunning
: 是一个全局的布尔变量,在MainScreen
的onPause
中设为false,在MainScreen
的onResume
中设为true。
Global.NotificationScreenRunning
: 是一个全局的布尔变量,在NotificationScreen
的onPause
中设为false,在NotificationScreen
的onResume
中设为true。
if
块中放置一个日志消息? - Kevin KrumwiedestartActivity(Intent);
- 那不可能是对的,应该是startActivity(intent);
吧? - Kevin Krumwiede