Android-Service&Notification

Notification

当某个应用不在前台运行,想发出一些提示信息时,就可以借助Notification来实现。
创建Notification首先需要创建NotificationManager实例来对其进行管理。

NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

然后通过support-v4库中的NotificationCompat类的构造器来创建Notification。

Notification notification = new NotificationCompat.Builder(context).build();

最后调用NOtificationManager的notify()方法让其显示出来,第一个参数是Notificaton的id。

manager.notify(1, notification);

但此时的Notification只是一个空的对象,可以通过在build()之前增加一系列set方法增添其功能。

  • setContentTitle(String);
  • setContentText(String);

分别指定Notification的标题内容和正文内容。

  • setWhen(System,currentTimeMills());

指定通知被创建的时间。

  • setSmallIcon();
  • setLargeIcon();

分别指定通知的小图标和大图标。

  • setSound(URI);

指定通知发出时播放一段音频。

  • setVibrate(new Long[] {0, 1000, 1000, 1000});

指定通知发出时的振动频率,长整型的数组,下标为奇数的表示手机静止时长,下标为偶数的表示手机振动时长,单位为毫秒。

  • setDefaults(NotificationCompat.DEFAULT_ALL);

指定通知发出时的效果由手机环境来决定。

  • setContentIntent(PendingIntent);

PendingIntent相当于一个延时执行的Intent,它提供了getActivity() getBroadcast() getService()方法来获得实例。

Intent intent = new Intent(this, anotherActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
  • setAutoCancel(true);

指定通知被点击后,会自动取消。

Service

Service是一种计算型组件,用于在后台执行一系列计算任务。Service组件有两种运行模式:

  • 运行状态
    Service内部可以做一些后台计算,并且不需要和外界有直接的交互。
  • 绑定状态
    Service内部也可以做一些后台计算,但外界可以方便地和Service组件进行通信。

创建Service

创建Service的方法和静态注册BroadcastReceiver的方法类似
首先创建一个自定义Service类继承Service,并重写onBinder()方法。
另外,Service中处理事情的方法是onStartCommand()

class MyService extends Service{
    public MyService{
    }

    @Override
    public IBinder onBind(Intent intent){
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId){
        return super.onStartCommand(Intent intent, int flags, int startId);
    }
}

然后在AndroidManifest.xml中进行注册

  • android:enabled表示是否启用这个服务
  • android:exported表示是否允许本程序之外的程序访问这个服务
...
<service
    android:name=".MyServicer"
    android:enabled="true"
    android:exported="true">
</service>
...

启动和停止Service

启动Service的方法与启动Activity的方法类似,是由Intent触发的。然后调用Context的startService()方法。
停止Service则是调用Context的stopService()方法,或者在MyService内部调用stopSelf()方法。

Intent intent = new Intent(this, MyService.class);
startService(intent);
stopService(intent);

Activity与Service通信

Activity与Service通信,是通过Activity绑定Service实现的。Context的bindService()方法和unbindService()分别用于绑定服务和解绑服务。

Intent intent = new Intent(this, MyService.class);
//BIND_AUTO_CREATE表示Activity与Service绑定后自动创建服务
bindService(intent, connection, BIND_AUTO_CREATE);

此方法的第二个参数是一个ServiceConnection类型的,ServiceConnection中有两个方法onServiceConnected()和onServiceDisconnected(),分别会在Activity与Service绑定和解绑时调用。

class MainActivity extends AppCompatActivity{

    private MyService.MyBinder myBinder;

    private ServiceConnection connection = new ServiceConnection(){

        @Override
        public void onServiceDisconnected(ComponentName name){
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service){
            myBinder = (MyBinder) service;
            myBinder.method();
        }
    };
}

在onServiceConnected()方法中IBinder向下转型得到一个MyBinder类型的实例,MyBinder是继承Binder在M有Service中实现内部类,并且可以在其中自定义一些方法,然后通过onServiceConnected()中调用,实现了Activity管理Service的目的。最后重写MyService类中的onBinder()方法,使得其他Activity绑定时,获取相同的MyBinder实例。

class MyService extends Service{

    private MyBinder myBinder;

    class MyBinder extends Binder{
        public void method(){
            //do something
        }
    }

    @Override
    public IBinder onBind(Intent intent){
        return myBinder;
    }
}

Service的生命周期

  • 调用startService()和stopService()
    onCreate()→onStartCommand()→onDestroy()
  • 调用bindService()和unbindService()
    onCreate()→onBind()→onStartCommand()→onDestroy()

前台服务

创建前台服务和创建通知很类似,只是在构建出Notification后,并没有使用NotificationManager的notify()将通知显示出来,而是调用了startForeground()方法让Service变成一个前台服务,并在系统状态栏显示出来。

Intent intent = new Intent(this, MainActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
Notification notification = new NotificatonCompat.Builder(this).build();
startForeground(1, notification);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Framework 层是 Android 系统中非常重要的一层,它提供了丰富的 API 和服务,包括 Activity、Service、Content Provider、Broadcast Receiver、PackageManager、Window Manager 等等,它们为应用程序提供了一个丰富的运行环境和开发框架。 Android Framework 层的源码主要包括以下几个部分: 1. Activity Manager:负责管理 Android 应用程序的生命周期、进程和任务栈等。 2. Package Manager:负责管理应用程序的安装、卸载和更新等操作。 3. Content Provider:提供了一种标准的接口,让应用程序之间可以共享数据。 4. Telephony Manager:提供了访问手机通讯功能的接口和服务。 5. Location Manager:提供了访问 GPS 和其他位置服务的接口和服务。 6. Notification Manager:提供了管理通知的接口和服务。 7. View System:提供了 Android 应用程序的 UI 界面的渲染和事件处理等功能。 8. Resource Manager:提供了访问 Android 应用程序的资源文件的接口和服务。 9. Window Manager:提供了窗口管理和界面绘制等功能。 10. Activity Manager Service:提供了 Activity Manager 的服务接口。 11. System Server:提供了 Android 系统的核心服务,包括 PackageManager、ActivityManager、WindowManager 等。 以上是 Android Framework 层源码的主要部分,通过阅读 Android Framework 层源码可以深入了解 Android 系统的实现原理和应用程序的开发框架。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值