活动不可见时未触发Android onNewIntent()

时间:2018-08-25 14:15:07

标签: android notifications onnewintent

我有2个活动,第一个是MainActivity。在“清单活动”的启动模式中,“第二活动”设置为 SingleInstance 。MainActivity中的按钮将启动SecondActivity,该按钮具有触发通知的按钮。唯一的问题是,当SecondActivity不可见时,不会调用SecondActivity的 onNewIntent()方法。为什么当应用程序处于后台或后台时未调用 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 :(得分:1)

根据documentation

  

对于在其程序包中将launchMode设置为“ singleTop”的活动,或者如果客户端在调用startActivity(Intent)时使用了Intent.FLAG_ACTIVITY_SINGLE_TOP标志,则调用此方法。

基于此,您可以尝试以下任一方法:

  • 将清单中的android:launchMode设置为singleTop;或
  • 在调用Intent之前通过intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)将标志添加到startActivity

如果您:

  • 需要singleInstance行为;和
  • 希望在后台的Activity到达前台时得到通知(例如,在singleInstance情况下);和
  • 不需要显式Intent

然后您可以实现onResume方法,当用户返回到Activity时将调用该方法。

测试后编辑

我在测试中观察到的是,如果singleInstance Activity在后​​台并且Intent被传递给它(例如,通过startActivity)将它们排队,直到Activity进入前台,然后:

    每个onNewIntent被调用
  • Intent;然后
  • onResume被调用一次

这与文档相矛盾,但是可以用来解决您的问题。

documentation中所述:

  

请注意,getIntent()仍返回原始Intent。您可以使用setIntent(Intent)将其更新为新的Intent。

因此,如果在Intent出现在前台时很高兴处理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();
    }
}