关闭

android之PendingIntent的使用

标签: AndroidPendingIntentNotification
960人阅读 评论(0) 收藏 举报
分类:

PendingIntent的使用


知识点:

1、pendingIntent简介;

2、pendingIntent的基本用法;

3、notification通知的用法;


pendingIntent:

是比intent更加先进的一个类,它不同于intent,他必须要满足一定条件下,才回触发放在里面的intent操作。可以在程序外部进行执行。即是是程序已经退出了。


得到pendingIntent实例有几个方法:

public static PendingIntent getActivity(Context context, int requestCode,Intent intent, @Flags int flags)
public static PendingIntent getActivity(Context context, int requestCode,@NonNull Intent intent, @Flags int flags, @Nullable Bundle options)
public static PendingIntent getActivities(Context context, int requestCode,@NonNull Intent[] intents, @Flags int flags)
。。。

有很多方法可以获得PendingIntent,我们只挑1来讲。其它以后在更新。


在程序里面,我在主页面,放一个按钮,点击发送一个notification通知。然后点击通知,跳转到另一个页面去。

我在代码中已经做了很多注释,有不明白的直接看代码注释。

但是别忘了在androidmanifest文件中声明第二个activity。


主页面的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="@dimen/activity_horizontal_margin"
    android:orientation="vertical"
    tools:context="com.tanksu.kuyuyaojt.pendingintenttest.MainActivity">

    <Button
        android:id="@+id/btn_sendIntent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送pendingIntent" />

</LinearLayout>

很简单,就放了一个按钮。


主页面java代码:

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import static com.tanksu.kuyuyaojt.pendingintenttest.R.mipmap.ic_launcher;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btnNotify = null;
    private NotificationManager nm = null;
    private Notification.Builder notification = null;
    private Intent intent = null;
    private PendingIntent pi = null;
    private int count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnNotify = (Button) this.findViewById(R.id.btn_sendIntent);
        btnNotify.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_sendIntent:
                notifyMsg();
        }
    }

    private void notifyMsg() {
        NotificationManager nm = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
        intent = new Intent();//这个intent会传给目标,可以使用getIntent来获取
        intent.setClass(this, SecondActivity.class);
        //这里放一个count用来区分每一个通知
        intent.putExtra("intent", "intent--->" + count);//这里设置一个数据,带过去

        //参数1:context 上下文对象
        //参数2:发送者私有的请求码(Private request code for the sender)
        //参数3:intent 意图对象
        //参数4:必须为FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT,FLAG_UPDATE_CURRENT,中的一个
        pi = PendingIntent.getActivity(this, count, intent, PendingIntent.FLAG_CANCEL_CURRENT);//用户点击该notification后才启动SecondActivity类

        intent.putExtra("intent", "other intent--->" + count);
        Uri uri = Uri.parse("http:///baidu.com");//我这里还可以给一个uri参数,点击notification可以打开百度首页,但是intent.setClass就不可以要了
        intent.setData(uri);//设置uri到intent中
        intent.setAction(Intent.ACTION_VIEW);//设置为展示uri的内容,系统会自动给出可以打开uri的应用,需要你选择
        //用bundle来传参
        Bundle bundle = new Bundle();
        bundle.putString("key", "bundle string--->" + count);
        intent.putExtra("bundle", bundle);//这里把bundle放到intent中,可以在SecondActivity获取出来

        //参数1,2,3,4和前面的一样
        //最后一个参数是:指定目标activity如何创建的额外参数
        pi = PendingIntent.getActivity(this, count, intent, PendingIntent.FLAG_ONE_SHOT, bundle);//API 16以上
//        pi = PendingIntent.getService(this, 102, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        Notification.Builder builder = new Notification.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(pi)
                .setContentText("this is notification contentText msg--->" + count)
                .setContentTitle("this is contentTitle--->" + count)
                .setTicker("this is msg's hint count--->" + count)
                .setNumber(count);
//        Notification no = new Notification.Builder(this).build();//这个需要在API 16以上才可以用,我这里向下兼容到API 14(4.0)
        Notification notify2 = builder.getNotification();//而getNotification()方法已经被弃用了
        count++;
        notify2.flags |= Notification.FLAG_AUTO_CANCEL;//这里指定这个通知点击之后或者可以被清除按钮清除。 FLAG_NO_CLEAR 通知不能取消
        //参数1:此notification的识别好
        nm.notify(101, notify2);
    }
}

然后SecondActivity布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.tanksu.kuyuyaojt.pendingintenttest.MainActivity">

    <TextView
        android:id="@+id/tv_show"
        android:layout_width="match_parent"
        android:text="second activity"
        android:gravity="center"
        android:textColor="#f00"
        android:textSize="30sp"
        android:layout_height="wrap_content" />
</LinearLayout>
布局图片

SecondActivity 的java代码:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

/**
 * Created by kuyu.yaojt on 16/5/31.
 */

public class SecondActivity extends Activity{
    private TextView tv_show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Intent intent = getIntent();//得到传过来的intent
        String data = intent.getStringExtra("intent");
        System.out.println("-=-=-=>>data = " + data);
        Bundle bundle = intent.getBundleExtra("bundle");//得到在intent中的bundle
        System.out.println("-=-=-=>>bundle = " + bundle.getString("key"));
        tv_show = (TextView) findViewById(R.id.tv_show);
        tv_show.setText(bundle.getString("key"));
    }

}

运行程序,看到一个通知就在后台弹出来了



然后点击,就可以看到,跳到了第二个页面去了



可以看到我们页面上的数值已经传过来了,还有打印也是:

05-31 18:53:13.450 20961-20961/com.tanksu.kuyuyaojt.pendingintenttest I/System.out: -=-=-=>>data = other intent--->0
05-31 18:53:13.450 20961-20961/com.tanksu.kuyuyaojt.pendingintenttest I/System.out: -=-=-=>>bundle = bundle string—>0

我这里连续点击两次可以看到,后面的数值变了,但是我点击他,同样是走到第二个页面去了



第二个的页面:



对应打印信息就变成了:

05-31 18:58:26.260 20961-20961/com.tanksu.kuyuyaojt.pendingintenttest I/System.out: -=-=-=>>data = other intent--->1
05-31 18:58:26.260 20961-20961/com.tanksu.kuyuyaojt.pendingintenttest I/System.out: -=-=-=>>bundle = bundle string--->1

可以看到我们因为定义了发送的notification通知的id是一样的,所以,他会更新前面一个通知的内容

nm.notify(101, notify2);

但是我们把上面的代码改为

nm.notify(count, notify2);

然后在发送通知,可以看到,他就区分为每个都是不同的通知了。


我点击第二个通知,同样可以跳到第二个页面去了



关于pendingIntent的基本使用大概就是以上这些。当然还要往深里去学习才可以更好的掌握。

如有任何疑问,请及时与我联系。




0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:121149次
    • 积分:2505
    • 等级:
    • 排名:第14684名
    • 原创:128篇
    • 转载:11篇
    • 译文:0篇
    • 评论:40条
    最新评论