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



我有2个活动,第一个是MainActivity。在清单启动模式下,第二个活动设置为单个实例。MainActivity 中的按钮启动 SecondActivity,它有一个触发通知的按钮。唯一的问题是当SecondActivity不可见时,不会调用SecondActivity的onNewIntent((方法。为什么当应用程序在后台或 SecondActivity 对用户不可见时不调用onNewIntent((方法?

法典:

清单:

<?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:

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

第二活动.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();
}
}
}

根据文档

对于在其包中将 launchMode 设置为"singleTop"的活动,或者如果客户端在调用 startActivity(Intent( 时使用 Intent.FLAG_ACTIVITY_SINGLE_TOP 标志,则会调用此值。

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

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

如果您:

  • 需要singleInstance行为;和
  • 希望在后台Activity出现在前台时收到通知(例如在singleInstance的情况下(;以及
  • 不需要显式Intent

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

测试后编辑

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

  • 每个Intent都调用onNewIntent;则
  • onResume被调用一次

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

如文档中所述:

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

因此,如果您愿意在Activity出现在前台时处理Intent,则可以将上面的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();
}
}

相关内容

  • 没有找到相关文章