4

我有 2 个活动,第一个是 MainActivity。在第二个活动的清单启动模式设置为SingleInstance。 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>

爪哇:

MainActivity.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();
        }
    }
}
4

1 回答 1

2

根据文档

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

基于此,您可以尝试:

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

如果你:

  • 需要singleInstance行为;和
  • Activity当一个在后台的人出现在前台时(例如在这种情况下),希望得到通知singleInstance;和
  • 不需要Intent明确的

然后您可以实现该onResume方法,该方法将在用户返回到Activity.

测试后编辑

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

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

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

文档中所述:

请注意,getIntent()仍然返回原始 Intent。您可以使用setIntent(Intent)它来更新到这个新的 Intent。

因此,如果您愿意在s 出现在前台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();
    }
}
于 2018-08-25T15:25:12.387 回答