Android 应用程序异常行为不会启动意图中提到的活动
我在申请中有三个专业课 1) 意图服务:在这里,我接收推送通知,并根据通知消息和其他两个类的行为打开活动。下面是实现这一点的代码Android 应用程序异常行为不会启动意图中提到的活动,android,android-intent,notifications,Android,Android Intent,Notifications,我在申请中有三个专业课 1) 意图服务:在这里,我接收推送通知,并根据通知消息和其他两个类的行为打开活动。下面是实现这一点的代码 if(Global.isMainScreenRunning){ Intent intent = new Intent(this, MainScreen.class); intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } else if(!Global.Not
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) 通知屏幕:这是中介屏幕,因此如果应用程序未运行,将首先显示此屏幕,单击此屏幕的“是”按钮,主屏幕将打开,此屏幕将完成
3) 主屏幕:这是显示地图的应用程序的主屏幕。其核心行为是menifest文件中提到的ts alaunchmode=“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>
. 目前它有安卓5.0.2操作系统
第三次编辑
<?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>
为了测试这种行为,我调试了eclipse调试器中的代码。为了检查这一点,我在NotificationScreen
onResume
和onCreate
中设置了一个断点,但它从未被点击,而主屏幕的onResume
被点击
我还在if和else条件中添加了一个logs,但仍然打印了else条件的logs
第四次编辑
Global.isMainScreenRunning
:是全局boolean
变量,在MainScreen
的onPause
中为false,在MainScreen
的onResume
中为true
Global.NotificationScreen running
:是全局boolean
变量,在NotificationScreen
的onPause
中为假,在NotificationScreen
的onResume
中为真
我认为问题在于,主屏幕是从清单中声明为应用程序启动屏幕的启动屏幕调用的,因此当应用程序被终止并且您正在调用意图时,将调用该屏幕
相反,您可以做的是将消息广播到初始屏幕,并在初始屏幕中接收消息,然后根据条件从那里调用意图
这里还有一件事需要注意,只有在接收器在屏幕上注册后,你才能广泛地表达意图,否则它将永远不会被接收。因此,尝试user handler.postdayed方法并在1000毫秒或700毫秒后广播
Intent mIntent = new Intent(context, SplashScreen.class);
mIntent.setAction(Intent.ACTION_MAIN);
mIntent.addCategory(Intent.CATEGORY_LAUNCHER);
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mIntent);
broadcastMessage(context, message);
我在下面的帖子中回答了一个类似的问题。
我想这就是你要找的。请让我知道这是否符合您的要求,如果您觉得答案有用,如果我的答案对您有帮助,请向上投票,以便对其他人有用
干杯:)
编辑
我对此做了一些研究
根据链接,您可以有两个启动器活动
试试看,让我知道。希望这对您有所帮助。:) 全球国家是邪恶的,这个问题说明了原因。要了解发生了什么,您必须查看设置或清除全局标志的每个位置,并分析所有可能的执行路径。这远远超出了你能得到的帮助范围。Android上还有一个额外的复杂性,因为当你的应用程序在后台时,整个虚拟机可能会被摧毁(并且你所有的全局数据都会被清除)。同样糟糕的是,VM和应用程序
实例可能会在您退出最后一个活动后保留。如果发生这种情况,Application#onCreate(…)
将不会在下次启动应用程序时再次调用,并且所有的static
全局变量仍将设置为上次运行应用程序时的值
节省您的时间,停止使用全局状态。您可以尝试将android:taskAffinity=“:main”
添加到清单中的主屏幕活动中。
if(Global.isMainScreenRunning){
Intent intent = new Intent(this, MainScreen.class);
intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(Intent);//here is the problem change Intent to intent
} else if(!Global.NotificationScreenRunning){
Intent intent = new Intent(this, NotificationScreen.class);
intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
可能是因为主屏幕与NotificationScreen仍在同一个任务中,所以当NotificationScreen再次调用时,它调用了所有任务。
您可以尝试此演示以获得更直观的效果:
和
希望有帮助。我明白了你的意思,你希望每次在应用程序中收到通知时都恢复通知屏幕。为此,我可以建议一个解决方案,这将使应用程序运行并允许你实现预期的行为,但当你按下主页按钮时,你的主屏幕将不再活动。它将被关闭。我们都知道android为所有活动维护活动堆栈。所以,若你们按下设备后退按钮,那个么活动将从堆栈中弹出,你们将不会面临这个问题
我认为这是活动堆栈的标准行为。有关更多信息,请使用以下链接:
您可以尝试以下代码段:
Intent i = new Intent(NotificationFullScreen.this,
MainActivity.class);
i.putExtra("FROM", "Notification");
i.putExtra("bookingId", bookingId);
i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY
| Intent.FLAG_FROM_BACKGROUND);
startActivity(i);
NotificationFullScreen.this.finish();
全球化是怎样的