Android onNewIntent () не срабатывает, когда активность невидима - PullRequest
0 голосов
/ 25 августа 2018

У меня есть 2 действия, первое из которых MainActivity.В Манифесте режим запуска Second Activity установлен как SingleInstance . Кнопка в MainActivity запускает SecondActivity, которая имеет кнопку, которая вызывает уведомление.Единственная проблема заключается в том, что onNewIntent () метод SecondActivity не вызывается, когда SecondActivity не отображается. Почему метод onNewIntent () не вызывается, когда приложение находится в фоновом режиме или SecondActivityневидим для пользователя?

Код:

Манифест:

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
       >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SecondActivity"
            android:launchMode="singleInstance"
            android:parentActivityName=".MainActivity"/>
    </application>

</manifest>

Java:

MainActivity.java:

 Intent intent=new Intent(MainActivity.this,SecondActivity.class);
 startActivity(intent);

SecondActivity.java:

public class SecondActivity extends AppCompatActivity {
    int count=0;int id=3;Notification notification;
    NotificationManager notificationManager;
    Intent intent,intent1;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_second);
        findViewById(R.id.send).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                count++;
                intent1=new Intent(getApplicationContext(),SecondActivity.class);
                if (count>1){
                    intent1.putExtra("click",true);
                    }
                PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(),0,intent1,PendingIntent.FLAG_UPDATE_CURRENT);
                if (notificationManager==null)
                {
                    notificationManager= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                    }
                Notification.Builder builder=new Notification.Builder(getApplicationContext());
                builder.setSmallIcon(R.drawable.ic_launcher_background);
                builder.setContentTitle("My Notification");
                builder.setContentText("You have "+count+" message");
                builder.setContentIntent(pendingIntent);
                notification=builder.build();
                notificationManager.notify(3,notification);
                }        });
    }
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.e("OnNewIntent","Called");
        if (intent!=null&&intent.hasExtra("click")&&intent.getBooleanExtra("click",false))
        {
            Toast.makeText(getApplicationContext(), "Notification Clicked", Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(getApplicationContext(), "False", Toast.LENGTH_SHORT).show();
        }
    }
}

1 Ответ

0 голосов
/ 25 августа 2018

Согласно документации

Это вызывается для действий, которые устанавливают для launchMode значение "singleTop" в своем пакете или если клиент использовал флаг Intent.FLAG_ACTIVITY_SINGLE_TOP при вызовеstartActivity (Intent).

Исходя из этого, вы можете попробовать либо:

  • установить android:launchMode в манифесте на singleTop;или
  • добавление флага к Intent через intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) перед вызовом startActivity

Если вам:

  • нужен singleInstanceповедение;и
  • хотят получить информацию, когда Activity на заднем плане вышел на передний план (например, в случае singleInstance);и
  • явно не нужно Intent

, тогда вы можете реализовать метод onResume, который будет вызываться, когда пользователь возвращается кActivity.

Редактировать после тестирования

Что я наблюдал при тестировании, так это то, что если singleInstance Activity находится в фоновом режиме и Intent s передаютсяон (например, через startActivity) ставится в очередь до тех пор, пока Activity не выйдет на передний план, а затем:

  • onNewIntent вызывается для каждого Intent;затем
  • onResume вызывается один раз

Это противоречит документации, но может быть использовано для решения вашей проблемы.

Как отмечено в документации :

Обратите внимание, что getIntent() по-прежнему возвращает исходное намерение.Вы можете использовать setIntent(Intent), чтобы обновить его до этого нового намерения.

Итак, если вы счастливы обработать Intent s, когда Activity выходит на передний план, вы можете заменить свойonNewIntent выше с:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    setIntent(intent);
}

@Override
protected void onResume() {
    super.onResume();

    Intent intent = getIntent();
    if (intent != null && intent.hasExtra("click") && intent.getBooleanExtra("click", false)) {
        Toast.makeText(getApplicationContext(), "Notification Clicked", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(getApplicationContext(), "False", Toast.LENGTH_SHORT).show();
    }
}
...