Android开发中关闭service的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发中关闭service的问题相关的知识,希望对你有一定的参考价值。

我在一个主Activity开启我的一个Service,同时传递一个second整型变量到Service,然后那个Service中用AlarmManager定时second秒后调用sendBroadcast发送广播到receiver, Receiver收到这个广播后打开一个新的Activity。 现在的问题是,开启服务后我想在主activity中创建一个按钮用stopService关闭服务,但到了时间那个新的Activity还是会启动,除非清理内存才能让他不启动, service到底该怎么关闭啊? 求解

因为Service已经在运行的时候把Alarm设定过了,只是把Service停止掉的话,并不会把定时取消。所以,在主activity中创建的按钮通过stopService无法完成你的要求。你应该用AlarmManager取消在Service中设定的定时。 参考技术A 首先启动android模拟器。
打开cmd命令行窗口。输入adb -s emulator-5554 shell (指定5554模拟器)

$adb start-server (启动adb服务器)
$adb kill-server (关掉adb服务器)
参考技术B stopService 确实是关闭服务的,可是定时器不会因为service的停止而停止,因此你是不是应该先停掉定时然后再stopservice

如何在 Android SearchView 中关闭键盘?

【中文标题】如何在 Android SearchView 中关闭键盘?【英文标题】:How to dismiss keyboard in Android SearchView? 【发布时间】:2011-11-16 13:56:17 【问题描述】:

我在 ActionBar 中有一个 searchView。我想在用户完成输入后关闭键盘。我在 searchView 上有以下 queryTextListener

final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener()  
    @Override 
    public boolean onQueryTextChange(String newText)  
        // Do something 
        return true; 
     

    @Override 
    public boolean onQueryTextSubmit(String query) 

        showProgress();
        // Do stuff, make async call

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

        return true; 
     
;

基于类似的问题,以下代码应该关闭键盘,但在这种情况下不起作用:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

我也试过了:

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);

两者都不起作用。我不确定这是否是 Honeycomb 特定的问题,或者它是否与 ActionBar 中的 searchView 有关,或两者兼而有之。有没有人得到这个工作或知道为什么它不工作?

【问题讨论】:

【参考方案1】:

我正在尝试做类似的事情。我需要从另一个Activity 启动SearchActivity,并在加载时让搜索词出现在打开的搜索字段中。我尝试了上述所有方法,但最后(类似于Ridcully's answer above)我在onCreateOptionsMenu() 中将一个变量设置为SearchView,然后在onQueryTextSubmit() 中调用clearFocus(),当用户提交新搜索时:

private SearchView searchView;

@Override
public boolean onCreateOptionsMenu(Menu menu) 
    getMenuInflater().inflate(R.menu.search_menu, menu);
    searchView = (SearchView) menu.findItem(R.id.menu_search)
            .getActionView(); // set the reference to the searchView
    searchView.setOnQueryTextListener(this); 
    searchMenuItem = (MenuItem) menu.findItem(R.id.menu_search); 
    searchMenuItem.expandActionView(); // expand the search action item automatically
    searchView.setQuery("<put your search term here>", false); // fill in the search term by default
    searchView.clearFocus(); // close the keyboard on load
    return true;


@Override
public boolean onQueryTextSubmit(String query) 
    performNewSearch(query);
    searchView.clearFocus();
    return true;

【讨论】:

queryonCreateOptionsMenu 中定义在哪里? ..这是在别处定义的查询字符串。我会编辑它。该行也不需要,仅当您想预填充查询并且第二个参数 (false) 阻止它运行查询时。 非常感谢! searchView.clearFocus() 是我目前缺少的部分 不要使用searchView.clearFocus() ,因为下一个视图会以动画为焦点(我认为你不想这样做) 你应该返回 false【参考方案2】:

简单、直截了当、干净利落:

  @Override
  public boolean onQueryTextSubmit(String query) 
      // your search methods
      searchView.clearFocus();
      return true;
  

【讨论】:

根据文档,这应该是正确的答案,返回布尔值:如果查询已由侦听器处理,则返回 true,返回 false 则让 SearchView 执行默认操作。 developer.android.com/reference/android/widget/… 不要使用searchView.clearFocus() ,因为下一个视图会以动画为焦点(我认为你不想这样做) 你应该返回 false【参考方案3】:

在 onQueryTextSubmit 上返回 false,如下所示

@Override
public boolean onQueryTextSubmit(String s) 
     return false;

【讨论】:

@lostintranslation 因为这是正常的 UI 行为【参考方案4】:

如果你打电话,它会以某种方式工作

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);

然后

otherWidget.requestFocus();

【讨论】:

【参考方案5】:

对我来说,上述方法都不适用于第一次提交。它隐藏起来,然后立即重新显示键盘。我必须在视图的处理程序上发布clearFocus() 才能在完成其他所有操作后实现它。

mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() 
            @Override
            public boolean onQueryTextSubmit(String query) 
                if (!"".equals(query)) 
                    mSearchView.post(new Runnable() 
                        @Override
                        public void run() 
                            mSearchView.clearFocus();
                        
                    );
                
                return true;
            

            @Override
            public boolean onQueryTextChange(String newText) 
                return false;
            
        );

【讨论】:

【参考方案6】:

对我来说,以下工作:

在我的活动中,我有一个成员变量

private SearchView mSearchView;

onCreateOptionsMenu() 中我这样设置变量:

public boolean onCreateOptionsMenu(Menu menu) 
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.library, menu);
    mSearchView = (SearchView)menu.findItem(R.id.miSearch).getActionView();
    mSearchView.setOnQueryTextListener(this);
    return true;
   

最后在QueryTextListener,我这样做了:

mSearchView.setQuery("", false);
mSearchView.setIconified(true); 

我查看了 SearchView 的源代码,如果您不将查询文本重置为空字符串,SearchView 只会这样做,并且不会移除键盘。实际上,在源代码中深入挖掘,结果是一样的,yuku 建议,但我仍然更喜欢我的解决方案,因为我不必乱搞那些低级的东西。

【讨论】:

【参考方案7】:

编辑:我在顶部添加了更好的解决方案,但也保留了旧答案作为参考。

 @Override
        public boolean onQueryTextSubmit(String query) 

                  searchView.clearFocus();
            return false;
        

原始答案:我使用 setOnQueryTextListener 进行编程。当搜索视图被隐藏时,键盘消失,然后当它再次可见时,键盘不会弹回。

    //set query change listener
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
        @Override
        public boolean onQueryTextChange(String newText) 
            // TODO Auto-generated method stub
            return false;
        

        @Override
        public boolean onQueryTextSubmit(String query) 
            /**
             * hides and then unhides search tab to make sure keyboard disappears when query is submitted
             */
                  searchView.setVisibility(View.INVISIBLE);
                  searchView.setVisibility(View.VISIBLE);
            return false;
        

     );

【讨论】:

你为什么使用幻数,而不是常量本身?此外,这只是一个 hacky 答案。【参考方案8】:

如果有人正在寻找如何折叠搜索视图/键盘,请使用以下代码

     /*
        setup close button listener
     */
    searchView.findViewById<ImageView>(R.id.search_close_btn).setOnClickListener 
        adapter.filter(null)//reset default list
        searchView.onActionViewCollapsed() //collapse SearchView/Keyboard
        true
    

    /*
        setup text change listener
     */
    searchView.setOnQueryTextListener(object:SearchView.OnQueryTextListener
        override fun onQueryTextSubmit(query: String?): Boolean 

            adapter.filter(if(query.isNullOrEmpty()) "" else query)

            searchView.onActionViewCollapsed() //collapse SearchView/Keyboard
            return true
        

        override fun onQueryTextChange(newText: String?): Boolean 
            adapter.filter(if(newText.isNullOrEmpty()) "" else newText)
            return true
        
    )

【讨论】:

【参考方案9】:

在我正在使用双窗格活动的平板电脑应用中,我只写了

f.getView().requestFocus(); // f is the target fragment for the search

这足以在搜索后关闭软键盘。无需使用 InputMethodManager

【讨论】:

【参考方案10】:

我使用了 ActionBarSherlock 4.3,我有一个 ProgressDialog。当我在 postExecute 方法中关闭它时,Searchview 获得焦点。要解决这个问题:

//Handle intent and hide soft keyboard
    @Override
    protected void onNewIntent(Intent intent) 
        setIntent(intent);
        handleIntent(intent);
        searchView.setQuery("", false);
        searchView.setIconified(true);
        searchView.clearFocus();
    

    /*When dismiss ProgressDialog, searchview gain focus again and shows the keyboard. I  call clearFocus() to avoid it.*/

    AsyncTask.onPostExecute()
      if(pd!=null)
        pd.dismiss();
      if(searchView!=null)
        searchView.clearFocus();
    

希望对你有帮助。

【讨论】:

【参考方案11】:

你可以使用它。

if (isKeybordShowing(MainActivity.this, MainActivity.this.getCurrentFocus())) 
    onBackPressed();


public boolean isKeybordShowing(Context context, View view) 
    try 
        InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        keyboard.hideSoftInputFromWindow(view.getWindowToken(), 0);
        return keyboard.isActive();
     catch (Exception ex) 
        Log.e("keyboardHide", "cannot hide keyboard", ex);
        return false;
    

【讨论】:

【参考方案12】:

两个对我有用的解决方案,第一个使用 SearchView 实例:

private void hideKeyboard()
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);

第二种解决方案:

private void hideKeyboard()
            InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
 

【讨论】:

【参考方案13】:

下面的代码可以让我在 Searchview 中隐藏键盘

MenuItem searchItem = baseMenu.findItem(R.id.menuSearch);

edtSearch= (EditText) searchItem.getActionView().findViewById(R.id.search_src_text);

MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() 
                        @Override
                        public boolean onMenuItemActionExpand(MenuItem item) 
                            edtSearch.post(new Runnable() 
                                @Override
                                public void run() 
                                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                                    imm.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
                                
                            );
                            return true;
                        

                        @Override
                        public boolean onMenuItemActionCollapse(MenuItem item) 
                            return true;
                        
                    );

【讨论】:

【参考方案14】:

你为什么不试试这个?当您触摸 X 按钮时,无论如何都会触发对搜索视图的关注。

ImageView closeButton = (ImageView)searchView.findViewById(R.id.search_close_btn);
        closeButton.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                EditText et = (EditText) findViewById(R.id.search_src_text);
                et.setText("");`enter code here`
                searchView.setQuery("", false);
                searchView.onActionViewCollapsed();
                menuSearch.collapseActionView();
            
        );

【讨论】:

【参考方案15】:
fun View.hideKeyboard() 
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(windowToken, 0)

【讨论】:

【参考方案16】:
 @Override
    public void onResume() 
        super.onResume();
        searchView.clearFocus();
    

我尝试了上述所有答案,但没有一个有效,清除焦点 onResume 对我有用

【讨论】:

以上是关于Android开发中关闭service的问题的主要内容,如果未能解决你的问题,请参考以下文章

如果蓝牙在 Android 应用程序中关闭,则通知

如何在 Kotlin 中关闭 Android 应用程序

在 Android Cordova-app 中关闭 textarea 和 inputfields 的自动完成功能

如何在android中关闭AlertDialog

你如何在android studio中关闭版本控制?

如何在android中关闭数据连接?