Приложение Android запускается медленно при нажатии на уведомление - PullRequest
0 голосов
/ 20 декабря 2018

Я использую FCM для отправки push-уведомлений в мое приложение;ожидаемое поведение, когда пользователь нажимает на уведомление, - запуск приложения в обычном режиме, например, нажатие на значок приложения запуска.

В тот момент, когда пользователь нажимает на уведомление, потратьте более 30 секунд, прежде чем приложение откроется.Уведомления уходят, но приложение не открывается ... Даже белый экран, ничего.

Когда срабатывает onMessageReceived, вызывается метод displayNotification.

private void displayNotification(String title, String body) {

    createNotificationChannel();
    PendingIntent contentIntent = generateNotificationContentIntent();

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, CONTENTS_CHANNEL_ID)
            .setSmallIcon(R.drawable.logo_no_bg_white)
            .setContentTitle(title)
            .setContentText(body)
            .setContentIntent(contentIntent)
            .setAutoCancel(true);

    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
    notificationManager.notify(new Random().nextInt(), notificationBuilder.build());
}

private PendingIntent generateNotificationContentIntent(){
    Intent intent = new Intent(this, MainActivity.class);
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addNextIntentWithParentStack(intent);
    return stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
}

private void createNotificationChannel() {

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O){
        return;
    }

    NotificationChannel notificationChannel = new NotificationChannel(CONTENTS_CHANNEL_ID, CONTENTS_CHANNEL_ID, NotificationManager.IMPORTANCE_DEFAULT);
    notificationChannel.setDescription(CONTENTS_CHANNEL_ID);

    NotificationManager notificationManager = getSystemService(NotificationManager.class);
    notificationManager.createNotificationChannel(notificationChannel);

}

Мой метод onCreate MainActivity просто проверяет, зарегистрирован ли пользователь, и, если это так, запускает HomeActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    PACKAGE_NAME = getApplicationContext().getPackageName();

    //Read shared preferences.
    sharedPref = getSharedPreferences(PACKAGE_NAME, Context.MODE_PRIVATE);

    if(sharedPref.contains("token") || sharedPref.getBoolean("isGuest", false)){
        //Redirect to home
        Intent homeIntent = new Intent(getApplicationContext(), HomeActivity.class );
        homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(homeIntent);
        finish();
    }

    loadTowns(this);

}

Что я делаю не так?

ОБНОВЛЕНИЕ: манифест

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="my.awesome.package">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />

<application
    android:allowBackup="false"
    android:icon="@mipmap/icon"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/icon"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    tools:ignore="GoogleAppIndexingWarning">
    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.com.vansuita.pickimage.provider"
        android:exported="false"
        android:grantUriPermissions="true"
        tools:replace="android:authorities">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/picker_provider_paths" />
    </provider>

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/logo_no_bg_white" />
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@android:color/holo_orange_dark" />

    <activity
        android:name=".MainActivity"
        android:screenOrientation="portrait"
        android:theme="@style/NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".LoginActivity"
        android:screenOrientation="portrait"
        android:theme="@style/NoActionBar" />
    <activity
        android:name=".HomeActivity"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme" />
    <activity
        android:name=".ChannelProfileActivity"
        android:label="@string/channel"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme" />
    <activity
        android:name=".TownProfileActivity"
        android:label="@string/town"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme" />
    <activity
        android:name=".ContentActivity"
        android:label="@string/content"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".HomeActivity" />
    </activity>
    <activity
        android:name=".ContentsListActivity"
        android:label="@string/contents"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".HomeActivity" />
    </activity>
    <activity
        android:name=".QuestionResultsActivity"
        android:label="@string/question"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".HomeActivity" />
    </activity>
    <activity
        android:name=".ForgetPasswordActivity"
        android:label="@string/DidYouForgetPassword"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme" />
    <activity
        android:name=".ValidationProcesActivity"
        android:label="@string/verify_user"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".HomeActivity" />
    </activity>
    <activity
        android:name=".QuestionVoteActivity"
        android:label="@string/question"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".HomeActivity" />
    </activity>
    <activity
        android:name=".NewUserActivity"
        android:label="@string/new_user"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme" />
    <activity
        android:name=".NewUserSuccessActivity"
        android:label="@string/new_user"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme" />

    <service android:name=".firebase.MyFirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    <service android:name=".firebase.MyFirebaseInstanceIdService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

    <activity
        android:name=".NotificationsActivity"
        android:label="@string/notifications"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme" />
    <activity
        android:name=".ViewNotificationActivity"
        android:label="@string/notifications"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme" />
    <activity
        android:name=".NewFriendshipRequestActivity"
        android:label="@string/notifications"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme" />

    <activity
        android:name=".TypeUserSelectionActivity"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme" />
    <activity
        android:name=".SelectTownActivity"
        android:screenOrientation="portrait"
        android:theme="@style/WhiteActionBarTheme" />
</application>

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Попробуйте, это работает для меня.

Intent notificationIntent = new Intent(this, MainActivity.class);
        /*flags for resume activity*/
        notificationIntent.setFlags( Intent.FLAG_ACTIVITY_SINGLE_TOP
                |Intent.FLAG_ACTIVITY_CLEAR_TASK
                |Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        builder.setContentIntent(contentIntent);
        /*for clear notification on click*/
        builder.setAutoCancel(true);
0 голосов
/ 20 декабря 2018

Добавьте PendingIntent.FLAG_ONE_SHOT к вашему ожидаемому намерению.

stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_ONE_SHOT);

Также добавьте android: exported = "true" к тегу активности в манифесте

...