android之PendingIntent的使用

原创 2016年05月31日 19:37:40

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的基本使用大概就是以上这些。当然还要往深里去学习才可以更好的掌握。

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




版权声明:本文为博主原创文章,未经博主允许不得转载。

Android中pendingIntent的深入理解

pendingIntent字面意义:等待的,未决定的Intent。 要得到一个pendingIntent对象,使用方法类的静态方法 getActivity(Context, int, Intent,...
  • YUZHIBOYI
  • YUZHIBOYI
  • 2013年01月09日 11:14
  • 118561

Android中AlarmManager详解以及利用PendingIntent设置闹钟

AlarmManager是提供一种访问系统闹钟服务的方式,允许你去设置在将来的某个时间点去执行你的应用程序。当你的闹钟响起(时间到)时,在它上面注册的一个意图(Intent)将会被系统以广播发出,然后...
  • qq_28330221
  • qq_28330221
  • 2017年03月12日 12:27
  • 2976

PendingIntent详解

本文翻译整理自:http://developer.android.com/reference/android/app/PendingIntent.html public final class ...
  • hudashi
  • hudashi
  • 2011年12月11日 10:54
  • 30153

Android状态栏通知(notification)PendingIntent传值(解决传值总是获取第一次的值的问题)

Pendingintent传值问题 pendingintent传值经常获取到的值是第一次的值或者null,这个跟第二个参数和最后一个参数选择有关系。 PendingIntent pendingInt...
  • Ray534
  • Ray534
  • 2016年10月08日 17:02
  • 882

NotificationActivity通过PendingIntent跨Activity传参失败(无效)问题

使用NotificationActivity时需要创建一个PendingIntent对象。PendingIntent对象由android系统负责管理并与应用程序脱离,因此在退出应用程序后该对象仍然不会...
  • goleftgoright
  • goleftgoright
  • 2012年02月21日 14:00
  • 4359

Notification使用以及PendingIntent.getActivity()

public void sendNotification(Context ctx, String message) {   // get the notification manager   St...
  • JoeBaby_
  • JoeBaby_
  • 2012年09月13日 10:58
  • 28778

说说PendingIntent的内部机制

博客源址:说说PendingIntent的内部机制 博客时间:2014-01-30 17:35 1 概述         在Android中,我们常常使用PendingInt...
  • Buaaroid
  • Buaaroid
  • 2015年11月05日 15:23
  • 977

PendingIntent的使用

PendingIntent的使用 * Flags的类型: FLAG_ONE_SHOT:得到的pi只能使用一次,第二次使用该pi时报错 FLAG_NO_CREATE: 当pi不存在时...
  • ydpl2007
  • ydpl2007
  • 2012年05月22日 16:52
  • 7383

Intent和PendingIntent的区别

intent英文意思是意图,pending表示即将发生或来临的事情。 PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。 Int...
  • zeng622peng
  • zeng622peng
  • 2011年02月12日 09:25
  • 144683

[Android] PendingIntent详解

转:http://my.oschina.net/u/242041/blog/206710  Intent是一个意图,一个描述了想要启动一个Activity、Broadcast或是Service的...
  • zhangmiaoping23
  • zhangmiaoping23
  • 2016年08月03日 11:31
  • 3214
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android之PendingIntent的使用
举报原因:
原因补充:

(最多只允许输入30个字)