PendingIntent和Intent
Posted show_wjy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PendingIntent和Intent相关的知识,希望对你有一定的参考价值。
pendingIntent字面意义:等待的,未决定的Intent。要得到一个pendingIntent对象,使用方法类的静态方法
getActivity(Context, int, Intent, int)
,getBroadcast(Context, int, Intent, int)
,
getService(Context, int, Intent, int) 分别对应着Intent的3个行为,跳转到一个activity组件、打开一个广播组件和打开一个服务组件。
参数有4个,比较重要的事第三个和第一个,其次是第四个和第二个。可以看到,要得到这个对象,必须传入一个Intent作为参数,必须有context作为参数。
主要的使用的地方和例子:通知Notificatio的发送,短消息SmsManager的发送和警报器AlarmManager的执行等等。
使用alarm机制定时启动service,并让service显示Notification的例子
首先创建待定意图
[java] view plain copy
- mAlarmSender = PendingIntent.getService(AlarmService.this,0, new Intent(AlarmService.this, AlarmService_Service.class), 0);
[java] view plain copy
- AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
- am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,firstTime, 30*1000, mAlarmSender);
AlarmService_Service是接收intent的service
service首先显示Notification
[java] view plain copy
- mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
- showNotification();
- private void showNotification()
- CharSequence text = getText(R.string.alarm_service_started);
- Notification notification = new Notification(R.drawable.stat_sample, text,
- System.currentTimeMillis());
- PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
- new Intent(this, AlarmService.class), 0);
- notification.setLatestEventInfo(this, getText(R.string.alarm_service_label),
- text, contentIntent);
- mNM.notify(R.string.alarm_service_started, notification);
Notification的第1个参数,用来表示通知发出时,状态栏显示的的图标
Notification的第2个参数,用来表示通知发出时,状态栏显示的滚动文字
Notification的第3个参数,用来表示通知的时间
notification.setLatestEventInfo的参数2,里面设置的文字对应Sample Alarm Service这句话
notification.setLatestEventInfo的参数3,里面设置的文字对应The alarm service has started running这句话
[java] view plain copy
- mNM.notify(R.string.alarm_service_started, notification);
service退出的时候,就会将通知消除
[java] view plain copy
- public void onDestroy()
- // Cancel the notification -- we use the same ID that we had used to start it
- mNM.cancel(R.string.alarm_service_started);
- // Tell the user we stopped.
- Toast.makeText(this, R.string.alarm_service_finished, Toast.LENGTH_SHORT).show();
点击通知的时候,会执行传入的待定意图,启动画面
[java] view plain copy
- PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
- new Intent(this, AlarmService.class), 0);
- notification.setLatestEventInfo(this, getText(R.string.alarm_service_label),
- text, contentIntent);
注意:PendingIntent.getService是用来启动service的待定意图,PendingIntent.getActivity是用来启动Activity的待定意图
service接着启动一个线程,用来暂停15秒
[java] view plain copy- Thread thr = new Thread(null, mTask, "AlarmService_Service");
- thr.start();
[java] view plain copy
- long endTime = System.currentTimeMillis() + 15*1000;
- while (System.currentTimeMillis() < endTime)
- synchronized (mBinder)
- try
- mBinder.wait(endTime - System.currentTimeMillis());
- catch (Exception e)
- // Done with our work... stop the service!
- AlarmService_Service.this.stopSelf();
最后分析下Binder运用。按照我的理解,Binder就像是service提供的一个远程调用的插座。
其他进程可以通过这个插座连接到service上,并调用Binder提供的一些方法。ServiceConnection就像是其他进程的插头,用来取得service提供的Binder。
[java] view plain copy
- private ServiceConnection mConnection = new ServiceConnection()
- public void onServiceConnected(ComponentName className, IBinder service)
- // Called when the connection is made.
- serviceBinder = ((MyService.MyBinder)service).getService();
- public void onServiceDisconnected(ComponentName className)
- // Received when the service unexpectedly disconnects.
- serviceBinder = null;
- ;
[java] view plain copy
- Intent bindIntent = new Intent(MyActivity.this, MyService.class);
- bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE);
因为没有人调用binder的notify,所以它只能老老实实的等待wait函数超时了
以上是关于PendingIntent和Intent的主要内容,如果未能解决你的问题,请参考以下文章
面试官:说一下 PendingIntent 和 Intent 的区别