从服务开始的通知不会在点击时打开应用程序

时间:2018-02-09 15:36:04

标签: android android-fragments android-service android-notifications

早上好,

我已经制作了一个实现GpS位置的应用程序。我有一个服务,可以在LocationChanged事件中保存我的位置。为了避免Android关闭我的应用程序我开始通知,一切正常。但是现在,我希望当我点击Action Bar的通知时,app会回到前台。我使用片段,地图片段称为MappaFragment。我阅读了很多消息,但似乎无法解决我的问题。在我的代码下面,任何建议表示赞赏! 亚历克斯 这是我的监控服务:

    public int onStartCommand(Intent intent, int flags, int startId) {

        if (intent.getAction().equals(Constants.STARTFOREGROUND_ACTION)) {
            Log.i(TAG, "Received Start Foreground Intent ");
            Intent notificationIntent = new Intent(getApplicationContext(), LocationMonitoringService.class);

            Bundle extras = intent.getExtras();

            numeroTraccia = extras.getInt("numeroTraccia");

            itinerario = extras.getString("itinerarioRiferimento");

            notificationIntent.setAction(Constants.MAIN_ACTION);

            notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
            Intent.FLAG_ACTIVITY_CLEAR_TASK);

            setGiornoRiferimento(gg.checkDayLong(this));

            PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),
                0, new Intent(getBaseContext(),MappaFragment.class), 0);
            Bitmap icon =  BitmapFactory.decodeResource(getResources(), com.example.alex.myApp.R.drawable.smallicon );

            Notification.BigTextStyle bigText = new Notification.BigTextStyle();

            Notification notification = new Notification.Builder(getApplicationContext())
                .setContentTitle("MyApp")
                .setTicker(getString(R.string.track))
                .setStyle(bigText.bigText(getString(R.string.track)))
                .setSmallIcon(R.drawable.smallicon)
                .setLargeIcon(Bitmap.createScaledBitmap(icon, 128, 128, false))
                .setContentIntent(pendingIntent)
                .setOngoing(true)
                .build();
         startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE,
                notification);

}

这是我的清单:

    <activity android:name="com.example.alex.myApp.MainActivity"
        android:screenOrientation="portrait"
    android:configChanges="orientation|screenSize|keyboardHidden" />

    <activity
        android:name="com.example.alex.myApp.SplashScreen"
        android:label="@string/app_name">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service
        android:name="com.example.alex.myApp.services.MonitoringService"
        android:enabled="true"/>
    <receiver
        android:name="com.example.alex.myApp.RestarterBroadcastReceiver"
        android:enabled="true"
        android:exported="true"
        android:label="RestartWhenStopped">
        <intent-filter>
            <action android:name="com.example.alex.myApp.ActivityRecognition.RestartSensor"/>
        </intent-filter>
    </receiver>

提前致谢! 亚历

3 个答案:

答案 0 :(得分:1)

首先,

PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, new Intent(getBaseContext(),MappaFragment.class), 0);

这是不正确的。片段无法使用意图打开。您需要启动一个活动,然后重定向到所需的片段。

接下来的事情是,如果应用程序处于后台并且您点击通知,它将打开启动器活动。因此,在启动器活动中,您需要检查包对象,然后您可以重定向到特定活动或片段。 查看此帖子:Push notification works incorrectly when app is on background or not runningOpen specific Activity when notification clicked in FCM它可以帮助您更好地了解当应用处于后台和前台时FCM的工作原理。

答案 1 :(得分:0)

创建如下的BroadCast接收器:

public static class ActionReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {

    String action = intent.getAction();
    if (action.equals("open_activity")) {
      intent.setAction(Intent.ACTION_MAIN);
      intent.addCategory(Intent.CATEGORY_LAUNCHER);
      intent.setClass(AppContext.getContext(), MappaFragment.class);
      intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
      context.startActivity(intent);
    }
  }
}

然后,使用此notificationIntent.setAction("open_activity");

并将您的PendingIntent更改为:

PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),
                0, new Intent(AppContext.getContext(), ActionReceiver.class), 0);

注意:对于USing,您需要删除这些行:

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE, notification)

我建议使用BroadcastReceiver接收你想要在你的通知中做的任何事情。

另外,如果这不起作用,请尝试将.setAction(Intent.ACTION_MAIN)添加到您的通知中,如下所示:

Notification notification = new Notification.Builder(getApplicationContext())
                .setContentTitle("MyApp")
                .setTicker(getString(R.string.track))
                .setStyle(bigText.bigText(getString(R.string.track)))
                .setSmallIcon(R.drawable.smallicon)
                .setLargeIcon(Bitmap.createScaledBitmap(icon, 128, 128, false))
                .setContentIntent(pendingIntent)
                .setOngoing(true)
                .setAction("open_activity")
                .build();

答案 2 :(得分:0)

好吧,基本上我已经做过这样的事情;问题是,如果从Android销毁,我必须重新运行我的服务。为了更好地解释...我有一个带有片段的活动,里面有一个谷歌地图,然后我有一个永无止境的后台服务,将我的数据保存在数据库中,所以,我无法删除startBackground。 在我的broadcastReceiver下面

public class SensorRestarterBroadcastReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {
    Log.i(SensorRestarterBroadcastReceiver.class.getSimpleName(), "Service Stops! Oooooooooooooppppssssss!!!!");


    context.startService(new Intent(context, LocationMonitoringService.class));

    }
}