Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应用程序未运行时无法从通知调用活动方法_Java_Android_Android Intent_Android Notifications_Android Pendingintent - Fatal编程技术网

Java 应用程序未运行时无法从通知调用活动方法

Java 应用程序未运行时无法从通知调用活动方法,java,android,android-intent,android-notifications,android-pendingintent,Java,Android,Android Intent,Android Notifications,Android Pendingintent,我有一个警报提醒,显示带有额外数据的通知。我想做的是通过intent将额外数据从我的通知发送到我的主要活动,然后打开应用程序并调用该活动中的特定方法(位置信息)。该方法将根据我传递的locationId打开一个新活动 当我的应用程序在后台运行时,它工作得很好,但当它被杀死时,即当应用程序完全关闭时,它会打开应用程序的主要活动,但不会调用该方法 我的通知代码用于发送有意图的数据: Intent intent = new Intent(this, MainActivity.class); inten

我有一个警报提醒,显示带有额外数据的通知。我想做的是通过intent将额外数据从我的通知发送到我的主要活动,然后打开应用程序并调用该活动中的特定方法(位置信息)。该方法将根据我传递的
locationId
打开一个新活动

当我的应用程序在后台运行时,它工作得很好,但当它被杀死时,即当应用程序完全关闭时,它会打开应用程序的主要活动,但不会调用该方法

我的通知代码用于发送有意图的数据:

Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("fromNotification", true);
intent.putExtra("locationId", locationId);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
              | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 111, intent, 
              PendingIntent.FLAG_UPDATE_CURRENT);
这就是我如何称呼我的方法:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    if (getIntent().hasExtra("fromNotification")) {
        String locationId = getIntent().getStringExtra("locationId");
        CallFetchLocationInfoFromMapsFragment(locationId);
    }
}
我还尝试在我的主要活动onCreate的末尾添加,这本应是解决方案,但没有任何效果:

if (getIntent().hasExtra("fromNotification")) {
    String locationId = getIntent().getStringExtra("locationId");
    CallFetchLocationInfoFromMapsFragment(locationId);
}
我尝试了更多的解决方案(包括、、、等等),但都没能成功

清单(仅是主要活动部分):

在我的onCreate开始时,它确实显示了toast。我不能在onCreate开始时使用此条件,因为映射没有加载和设置,所以我在onCreate结束时添加了它。在这种情况下,它永远不会被调用

我可以通过直接从通知中打开新活动来实现,但这不是我理想的解决方案。我希望能够在应用程序关闭时从通知调用活动中的任何方法

我还尝试添加以下内容:

if (getIntent().hasExtra("fromNotification")) 
{
    Toast.makeText(MainActivity.this, "Notification!", Toast.LENGTH_LONG).show();
}
if (getIntent().hasExtra("fromNotification")) {
    String locationId = getIntent().getStringExtra("locationId ");
    CallFetchLocationInfoFromMapsFragment(locationId);
    Toast.makeText(MainActivity.this, "Notification id: " locationId, Toast.LENGTH_LONG).show();
}else{
    Toast.makeText(MainActivity.this, "No notification", Toast.LENGTH_LONG).show();
}
在onCreate结束时,我只是想看看是否可以显示这个值,但我一直得到“无通知”的吐司

当我在onCreate开始时设置相同的if条件时,它崩溃:

08-14 18:06:03.319 18591-18591/com.weekendcoder.kemo.hotels D/SQLiteHandler: Fetching notification settings from sqlite db
08-14 18:06:03.329 18591-18591/com.weekendcoder.kemo.hotels W/Settings: Setting airplane_mode_on has moved from android.provider.Settings.System to android.provider.Settings.Global, returning read-only value.
08-14 18:06:03.384 18591-18591/com.weekendcoder.kemo.hotels D/AndroidRuntime: Shutting down VM
08-14 18:06:03.384 18591-18591/com.weekendcoder.kemo.hotels W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41cdc700)
08-14 18:06:03.389 18591-18591/com.weekendcoder.kemo.hotels E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.weekendcoder.kemo.hotels/com.weekendcoder.kemo.hotels.MainActivity}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
    at android.app.ActivityThread.access$700(ActivityThread.java:159)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:176)
    at android.app.ActivityThread.main(ActivityThread.java:5419)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
    at com.weekendcoder.kemo.hotels.sliderfragments.MapsFragment.fetchlocationDetails(MapsFragment.java:545)
    at com.weekendcoder.kemo.hotels.MainActivity.CallFetchlocationDetailsFromMapsFragment(MainActivity.java:661)
    at com.weekendcoder.kemo.hotels.MainActivity.onCreate(MainActivity.java:324)
    at android.app.Activity.performCreate(Activity.java:5372)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349) 
    at android.app.ActivityThread.access$700(ActivityThread.java:159) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:176) 
    at android.app.ActivityThread.main(ActivityThread.java:5419) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:525) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
    at dalvik.system.NativeStart.main(Native Method) 
编辑:

有一个可行的解决方案,但我对此不满意,希望找到更智能/更安全的解决方案。解决方案是在开始时获取id,然后添加以下内容:

if (locationId != null) {
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            //Do something after 100ms
            CallFetchLocationInfoFromMapsFragment(locationId);
        }
    }, 5000);
}
这将允许我的应用程序等待5秒钟,然后在所有其他方法执行后调用该方法这是可行的,但我不确定这是否是最好的方法,有些设备可能会慢一些。最好是找到一种方法来检查onCreated是否完全完成了执行,然后调用此方法。

我认为您需要此方法

if (getIntent().hasExtra("fromNotification")) {
    String locationId = getIntent().getStringExtra("locationId");
    CallFetchLocationInfoFromMapsFragment(locationId);
}
以及在清单中设置活动的启动模式

<activity android:name=".YourActivity"
        android:launchMode="singleTask">
    ...
</activity>

...

在评论(如上)中的讨论中,您指出您正在使用
launchMode=“singleTask”
。这是一种特殊的启动模式,您的应用程序不需要此模式。它通常造成的问题比解决的问题多。请删除特殊启动模式,看看是否有帮助。完成此操作后,在应用程序未运行时点击通知应启动应用程序并创建一个新的
MainActivity
实例


您也可能无法在
onCreate()
中执行希望执行的操作,因为尚未设置
片段。您可能只需要记住在
onCreate()
中要执行的操作(开始位置详细信息),但将实际操作延迟到
onResume()
或设置了
片段之后

您面临此问题,因为一旦应用程序未运行且用户单击通知,它将重定向到活动的on create方法,您将无法在onNewIntent上获得调用。您可以在共享pref上存储数据,然后在onCreate@JineshChhichhiya我知道在这种情况下(当应用程序未运行时)我不能使用onNewIntent,但我应该能够在onCreate中添加该代码(方法调用),并且在应用程序关闭时它应该可以工作。发布您的声明,而不必查看所有代码,您可以尝试以下操作之一:1)只需在不延迟的情况下发布到处理程序。这将在
onCreate()
完成后运行。2) 运行
onResume()
中的代码,或在
onResume()
@DavidWasser中(毫不延迟地)将代码发送到处理程序。您真的很有帮助,您以前对类似问题的回答也很有帮助:)@nsdvd我在onCreate的末尾添加了if条件,但它不起作用。今天晚些时候我会尝试它,并告诉您它是否有效,但我想我可能已经尝试了单任务模式。我会让你知道,一旦我今天再次测试它。谢谢
<activity android:name=".YourActivity"
        android:launchMode="singleTask">
    ...
</activity>