绑定的方式调用服务的方法和采用接口方式抽取方法

Android服务机制详解
本文详细介绍了Android中的服务机制,包括两种启动方式:start方式和服务绑定方式,并对比了两者的生命周期和使用场景。start方式适用于后台任务,而绑定方式更适合组件间交互。

1.配置文件配置服务,复制包名+类名的快捷方式:拷贝全名称不是在类名中右键,而是展开类名下右键。

一、采用start的方式开启服务

  生命周期如下:

                                               onStart()过时了

  开启服务: onCreate()-->onStartCommand()  ---> onDestory();

  如果服务已经开启,不会重复的执行onCreate(), 而是会调用onStart()和 onStartCommand();

  服务停止的时候 onDestory().

  服务只会被停止一次


服务的生命周期 (start方式开启):

1.MainActivity

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,MyService.class);
    	//通知框架开启服务。
    	startService(intent);
    }
    public void stop(View view){
    	Intent intent = new Intent(this,MyService.class);
    	stopService(intent);
    }
    
    @Override
    protected void onDestroy() {
    	System.out.println("啊啊啊,我是activity,我挂了");
    	super.onDestroy();
    }
    //调用服务里面的方法。不可以自己new服务,调用的服务的方法,必须通过框架得到服务的引用。
    public void call(View view){
    
    }
}

MyService:

public class MyService extends Service {

	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}
	
	@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.图片理解


2.  生命周期

  onCreate()--->onBind();--->onunbind()-->onDestory();

 绑定服务不会调用onstart或者onstartcommand方法;

3.绑定服务代码

MainActivity:

public class MainActivity extends Activity {
	private MyConn conn ;
	private IMiddlePerson mp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    //绑定服务
    public void bind(View view){
    	//3.activity采用绑定的方式去开启服务。
    	Intent intent = new Intent(this,MyService.class);
    	conn = new MyConn();
    	bindService(intent, conn, BIND_AUTO_CREATE);
    	
    }
    //解除绑定服务
    public void unbind(View view){
    	unbindService(conn);
    }
    
    @Override
    protected void onDestroy() {
    	System.out.println("啊啊啊,我是activity,我挂了");
    	super.onDestroy();
    }
    //调用服务里面的方法。
    public void call(View view){
    	//5.通过中间人调用服务里面的方法。
    	mp.callMethodInService(55);
    }
    
    private class MyConn implements ServiceConnection{
    	//4. 当服务被连接的时候调用 服务别成功 绑定的时候调用
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			System.out.println("在activity里面成功得到了中间人");
			mp = (IMiddlePerson) service;
		}
		//当服务失去连接的时候调用(一般进程挂了,服务被异常杀死)
		@Override
		public void onServiceDisconnected(ComponentName name) {
			
		}
    }
}

MyService:

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("陪领导打麻将。");
		}
	}
}

定义接口IMiddlePerson:

/**
 * 中间人的接口定义
 *
 */
public interface IMiddlePerson {
	/**
	 * 代办暂住证
	 * @param money
	 */
	public void callMethodInService(int money);
}



三、两种开启服务方法的区别

1. start方式开启服务。一旦服务开启跟调用者(开启者)就没有任何关系了。

开启者退出了,开启者挂了,服务还在后台长期的运行。

开启者没有办法去调用服务里面的方法。(美国的司法独立)

2. bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。不求同时生,但求同时死。开启者可以调用服务里面的方法。




















---------------------------------------------------------------------------例子:手机卫士05,拦截信息--------------------------------------

public class CallSmsSafeService extends Service {
	public static final String TAG = "CallSmsSafeService";
	private InnerSmsReceiver receiver;
	private BlackNumberDao dao;
	private TelephonyManager tm;
	private MyListener listener;

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

	private class InnerSmsReceiver extends BroadcastReceiver{
		@Override
		public void onReceive(Context context, Intent intent) {
			Log.i(TAG,"内部广播接受者, 短信到来了");
			//检查发件人是否是黑名单号码,设置短信拦截全部拦截。
			Object[] objs = (Object[]) intent.getExtras().get("pdus");
			for(Object obj:objs){
				SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);
				//得到短信发件人
				String sender = smsMessage.getOriginatingAddress();
				String result = dao.findMode(sender);
				if("2".equals(result)||"3".equals(result)){
					Log.i(TAG,"拦截短信");
					abortBroadcast();
				}
				//演示代码。
				String body = smsMessage.getMessageBody();
				if(body.contains("fapiao")){
					//你的头发票亮的很  语言分词技术。
					Log.i(TAG,"拦截发票短信");
					abortBroadcast();
				}
			}
		}
	}
	
	@Override
	public void onCreate() {
		dao = new BlackNumberDao(this);
		receiver = new InnerSmsReceiver();
		IntentFilter filter =  new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
		filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
		registerReceiver(receiver,filter);
		super.onCreate();
	}
	
	@Override
	public void onDestroy() {
		unregisterReceiver(receiver);
		receiver = null;
		super.onDestroy();
	}

}



内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化并行计算等改进策略。; 适合人群:具备一定Python编程基础优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
<think>我们正在处理用户关于IDEA中抽取方法快捷键失效的问题。根据用户描述,使用鼠标操作正常,但快捷键无法使用。这通常与快捷键配置冲突或IDE设置有关。以下是系统的解决方案: ### 解决方案:快捷键失效排查步骤 #### 1. **检查快捷键映射** - 进入设置:`File → Settings` (Windows/Linux) 或 `IntelliJ IDEA → Preferences` (macOS) - 路径:`Keymap → Main menu → Refactor → Extract → Method` - **现象**: - 若右侧显示 `Alt+Shift+M` 且图标为 ![](https://img.icons8.com/color/48/000000/warning-shield.png)(冲突标识),说明存在快捷键冲突[^1] - **操作**: 1. 右键点击冲突项 → `Remove Ctrl+Shift+M` 清除冲突绑定 2. 重新为抽取方法操作绑定快捷键:右键 → `Add Keyboard Shortcut` → 按下 `Alt+Shift+M` → 确认 #### 2. **重置快捷键方案** - 步骤: 1. `Settings → Keymap` 2. 点击齿轮图标 → `Restore Defaults`(将恢复所有快捷键为出厂设置) - **注意**:此操作会清除自定义快捷键,需谨慎操作 #### 3. **检查外部干扰** - **常见干扰源**: - 系统快捷键(如Windows游戏栏默认占用 `Alt+Shift+M`) - 输入法快捷键(如搜狗输入法简繁切换) - 其他软件热键(如微信/钉钉截图快捷键) - **解决方案**: - 修改系统快捷键:`Windows设置 → 游戏 → 游戏栏 → 关闭录制快捷键` - 输入法设置:右键点击输入法状态栏 → 属性设置 → 修改冲突快捷键 #### 4. **验证IDE功能完整性** - 创建测试文件执行以下操作: ```java class Test { void demo() { // 选中下面两行尝试抽取方法 System.out.println("Hello"); System.out.println("World"); } } ``` - 预期行为: - 快捷键生效时会出现重构预览窗口 - 若仍无效 → 尝试 `File → Invalidate Caches` 清除缓存重启 ### 备用方案:临时替代操作 | 方式 | 操作路径 | |-----------------------|-----------------------------------------| | **菜单导航** | `Refactor → Extract → Method` | | **右键菜单** | 选中代码 → 右键 → `Refactor → Extract → Method` | | **快速修复** | 按 `Alt+Enter` 显示建议 → 选择 `Extract method` | ### ⚠️ 特殊情况处理 - **插件冲突**:在安全模式下启动IDEA(关闭所有插件) - 启动命令添加:`idea.exe -safe-mode` (Windows) / `./idea.sh -safe-mode` (Linux/macOS) - **JDK兼容性问题**:`Help → Find Action` → 输入 `Switch Boot JDK` → 切换为官方JDK > 📌 **诊断提示**:若问题仅发生在特定项目,请检查是否误触了 `VCS → Enable Vim Emulator`(Vim模式会覆盖快捷键) ### 技术原理 IDEA的快捷键系统采用分层绑定机制[^2]: ```mermaid graph LR A[硬件按键] --> B(操作系统拦截) B --> C{IDE快捷键映射层} C --> D[主菜单操作] D --> E[插件处理] E --> F[编辑器执行] ``` 当某一层被拦截时(如系统层优先捕获按键),IDE将无法触发对应操作。 ### 相关问题 1. 为什么IDEA的某些快捷键在特定文件中失效? 2. 如何批量修改多个重构操作的快捷键? 3. 插件开发时如何避免快捷键冲突? 4. 系统升级后IDEA快捷键失效的深层原因是什么?</think>### 解决IDEA抽取方法快捷键失效问题 根据您的描述(Alt+Shift+M快捷键失效但鼠标操作正常),以下是系统化的解决方案: #### 1. **检查快捷键冲突**(首要步骤) - **操作路径**:`File → Settings → Keymap` - **诊断步骤**: 1. 搜索栏输入 "Extract Method" 2. 查看右侧绑定的快捷键: - 若显示 `Alt+Shift+M` 且带 ⚠️ 图标:表示存在冲突 - 若未显示快捷键:需重新绑定 3. **解决方案**: - 右键点击冲突项 → `Remove Ctrl+Shift+M` - 重新绑定:右键 → `Add Keyboard Shortcut` → 按下 `Alt+Shift+M` #### 2. **重置快捷键方案** - **操作路径**:`Settings → Keymap → 下拉菜单` - **操作**: - 选择 `Default` 方案 - 点击右侧齿轮图标 → `Restore Defaults` > 💡 此操作可解决90%的快捷键异常问题[^1] #### 3. **检查外部干扰** - **常见干扰源**: - 系统快捷键冲突(特别是Windows游戏栏默认占用 `Alt+Shift+M`) - 输入法快捷键(如搜狗输入法的简繁切换) - 其他软件热键(如微信/Teams等通讯工具) - **解决方案**: ```mermaid graph LR A[快捷键失效] --> B{系统级检查} B --> C[关闭游戏栏] B --> D[切换输入法到英文状态] B --> E[退出后台软件] ``` #### 4. **验证IDE功能完整性** - **诊断步骤**: 1. 新建测试文件: ```java class Test { void demo() { // 选中下面两行尝试抽取方法 System.out.println("Hello"); System.out.println("World"); } } ``` 2. 使用 `Alt+Shift+M` 测试 3. 若仍失效 → `File → Invalidate Caches → Invalidate and Restart` #### 5. **备用解决方案** | 方式 | 操作路径 | 效率指数 | |-----------------------|-----------------------------------------|----------| | **菜单导航** | `Refactor → Extract → Method` | ⭐⭐ | | **右键调用** | 选中代码 → 右键 → `Refactor → Extract` | ⭐⭐⭐ | | **快速修复键** | 按 `Alt+Enter` → 选 `Extract method` | ⭐⭐⭐⭐ | #### ⚠️ 特殊情况处理 - **插件冲突**:关闭所有插件后测试(`Help → Find Action` 输入 "Plugins" → 禁用第三方插件) - **项目损坏**:删除 `.idea` 目录后重新导入项目(提前备份配置) - **硬件问题**:外接键盘测试,或使用 `Keyboard Tester` 在线工具检测按键 > 📌 **技术原理**:IDEA的快捷键系统采用分层处理机制,优先级为:`IDE设置 > 系统热键 > 插件绑定`。当系统层截获按键时,IDE层将无法响应[^1]。 ### 相关问题 1. 为什么IDEA的重构快捷键在不同文件类型中行为不一致? 2. 如何自定义代码重构操作的快捷键组合? 3. 插件安装后导致快捷键失效的根本原因是什么? 4. 有没有批量检测快捷键冲突的自动化工具? 5. 键盘硬件故障如何影响IDE的功能操作?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值