service一般是运行在后台的,优先级较低,容易被系统回收。这时,我们就需要用到前台service,前台service就需要创建一个notification来实现
private void showNotification() { Intent intent = new Intent(this, MainActivity.class); NotificationCompat.Builder mBuilder=new NotificationCompat.Builder(this); mBuilder.setSmallIcon(R.drawable.air) .setContentTitle("content title") .setContentText("content text") .setContentInfo("content info") .setContentIntent(PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT)); mBuilder.setDefaults(Notification.DEFAULT_ALL);//设置全部 Notification notification = mBuilder.build();//4.1以上用.build(); notification.flags |= Notification.FLAG_AUTO_CANCEL;// 点击通知的时候cancel掉 manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); manager.notify(notification_id,notification); startForeground(notification_id,notification); }
这里用到了setContentIntent()来设置点击通知之后跳转的界面,上面这种写法跳的Activity之后点击返回键会直接退到桌面,假如这个Activity有上级界面,我们需要点击返回的时候跳转到上级界面,就需要更改一下代码,使用TaskStackBuilder来创建任务栈,setContentIntent的参数PendingIntent就用TaskStackBuilder来获得。
为了简单演示,这里我们创建MainActivity和MessageActivity两个Activity,在MainActivity里点击按钮发送通知,点击通知跳转MessageActivity
public class MainActivity extends AppCompatActivity { private Button send; private Button cancle; NotificationManager manager; int notification_id; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); send = (Button) findViewById(R.id.send); cancle = (Button) findViewById(R.id.cancle); manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MessageActivity.class); NotificationCompat.Builder mBuilder=new NotificationCompat.Builder(MainActivity.this); mBuilder.setSmallIcon(R.drawable.air) .setContentTitle("content title") .setContentText("content text") .setContentInfo("content info"); // .setContentIntent(PendingIntent.getActivity(MainActivity.this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT)); //创建任务栈Builder TaskStackBuilder stackBuilder=TaskStackBuilder.create(MainActivity.this); stackBuilder.addParentStack(MessageActivity.class); stackBuilder.addNextIntent(intent); PendingIntent pendingIntent=stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(pendingIntent); mBuilder.setDefaults(Notification.DEFAULT_ALL);//设置全部 Notification notification = mBuilder.build();//4.1以上用.build(); notification.flags |= Notification.FLAG_AUTO_CANCEL;// 点击通知的时候cancel掉 manager.notify(notification_id,notification); } }); cancle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { manager.cancel(notification_id); } }); } }
MessageActivity是一个空Activity
然后配置AndroidManifest,给MessageActivity设置parentActivityName
<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=".MessageActivity" android:parentActivityName=".MainActivity"> </activity>这时就已经完成了,可是我在小米的6.0测试机上并没有效果,翻看几个博客都是评论有人问但是博主没有回答,有一位评论是4.2的Android版本可以 6.0的不可以,于是我用4.4的模拟器测试,发现是正常的,我又用5.0的华为手机测试,发现也是可以正常跳转的,然后又用6.0的模拟器测试,也是正常的。所以我推断可能是小米的系统做了某些修改,如果有哪位大神知道具体原因,还望告知。