Notification与前台service

本文介绍如何在安卓应用中使用前台Service通过Notification跳转到指定Activity,并利用TaskStackBuilder确保正确的Activity栈行为。文中提供了MainActivity和MessageActivity的示例代码,展示了如何设置点击Notification后返回上一级Activity的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    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的模拟器测试,也是正常的。所以我推断可能是小米的系统做了某些修改,如果有哪位大神知道具体原因,还望告知。


   



    



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值