我有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
时将调用该方法。
测试后编辑
我在测试中观察到的是,如果一个singleInstance
Activity
在后台并且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();
}
}