我有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();
}
}
}
答案 0 :(得分:1)
对于在其程序包中将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();
}
}