Android 应用程序异常行为不会启动意图中提到的活动

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

我在申请中有三个专业课

1) 意图服务:在这里,我接收推送通知,并根据通知消息和其他两个类的行为打开活动。下面是实现这一点的代码

 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 a
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>

. 目前它有安卓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();
全球化是怎样的