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

时间:2015-07-11 03:24:09

标签: android android-intent notifications

我在申请中有3个主要课程

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)NotificationScreen:这是调解器屏幕,因此如果应用程序未运行,将首先显示此屏幕,单击此屏幕的“是”按钮将打开MainScreen,此屏幕将完成。

3)主屏幕:这是显示地图的应用程序的主屏幕。它的核心行为是在清单文件中提到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>

第二次修改

我正在测试的手机是&#34; YU Yureka&#34;这是它的规范link。目前它有android 5.0.2 OS

第三次修改

为了测试这种行为,我调试了eclipse调试器中的代码。为了检查这一点,我在NotificationScreen onResumeonCreate中设置了一个断点,但它从未被击中,而onResume的{​​{1}}被击中。

此外,我添加了一个登录if和else条件,但仍打印了其他条件的日志。

第四次修改 MainScreen:是全局Global.isMainScreenRunning变量,在boolean的{​​{1}}中变为false,在onPause的{​​{1}}中变为true。

MainScreen:是全局onResume变量,在MainScreen的{​​{1}}中完成,在Global.NotificationScreenRunning的{​​{1}}中完成。< / p>

5 个答案:

答案 0 :(得分:0)

全球国家是邪恶的,这个问题说明了原因。要了解发生了什么,您必须查看设置或清除全局标志的每个位置,并分析可能在那里引导的所有可能的执行路径。这超出了你可以获得的那种帮助的范围。而且Android上有一个额外的复杂功能,因为只要你的应用程序在后台运行,整个虚拟机就可能被破坏(并且所有全局变量都被清除)。同样糟糕的是,退出上一个活动后,可能会保留VM和Application实例。发生这种情况时,下次启动应用时不会再次调用Application#onCreate(...),并且所有static全局变量仍将设置为上次运行应用时的状态。

为自己节省大量精力并停止使用全球状态。

答案 1 :(得分:0)

您可以尝试将android:taskAffinity=":main"添加到清单中的MainScreen活动中 也许是因为MainScreen仍然与NotificationScreen在同一个任务中,所以当NotificationScreen再次调用时,它会调用所有任务。
您可以尝试此演示以获得更直观的信息: play appcode
希望它有所帮助。

答案 2 :(得分:0)

当我明白你的意思时,你希望每次在应用程序中收到通知时都要恢复通知屏幕。为此我可以建议一个解决方案,这将使应用程序运行并允许你实现预期的行为,但是当你按下主页按钮你的主屏幕将不再活动。它将被杀死。我们都知道android维护所有活动的活动堆栈。所以如果你按设备返回按钮,那么活动将从堆栈中激活,你将不会遇到这个问题。

我认为这是活动堆栈的标准行为,您可以使用此链接获取更多信息:

http://www.slideshare.net/RanNachmany/manipulating-android-tasks-and-back-stack

您可以尝试以下代码段:

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();

答案 3 :(得分:-1)

你好@Abhinbav Singh Maurya

我认为问题是主屏幕是从清单中声明的​​启动屏幕调用的,因为应用程序启动屏幕,所以当应用程序被杀死并且你正在调用意图时,这将被调用。

而不是你可以做的是将消息广播到启动画面并在启动画面中接收它并根据条件从那里调用意图。

这里有一件你应该注意的事情,只有在接收器在SplahScreen中注册后才能广泛投射意图,否则它将永远不会被接收。所以尝试使用handler.postDelayed方法并在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);

我在下面的帖子中回答了类似的问题。 here

我认为这就是你要找的东西。请告诉我这是否符合您的要求,如果您认为答案有用,如果我的答案对您有帮助,请投票给对方,以便对其他人有用。

干杯:)

编辑

我对它进行了一些研究。

根据this链接,您可以有两个启动器活动。

尝试一下,让我知道。希望这对你有所帮助。 :)

答案 4 :(得分:-2)

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);
}