我正在尝试使用下面显示的简单应用程序(至少相关部分)更好地处理通知。我想在应用程序未被销毁时显示通知图标,并在销毁时删除通知图标;很简单吧?
我的问题是,当片段的onDestroyView事件被触发时,通知图标确实消失了,但随后再次出现,我无法找出原因。
为了更好地解决问题,我创建了一个停止通知按钮,调用mServiceBinder
的{{1}}方法,确实删除通知图标即使它正在调用stop()
事件中调用的相同方法。
关于问题的任何想法?
MainActivityFragment
onDestroyView
TestService
package org.chrisolsen.notificationtest;
import ...
/**
* A placeholder fragment containing a simple view.
*/
public class MainActivityFragment extends Fragment {
private ServiceConnection mServiceConn;
private TestService.TestBinder mServiceBinder;
public MainActivityFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main, container, false);
}
@Override
public void onDestroyView() {
Log.d("Fragment", "onDestroyView");
// *try* to prevent services from restarting
if (mServiceConn != null) {
getActivity().unbindService(mServiceConn);
}
if (mServiceBinder != null) {
mServiceBinder.stop();
}
mServiceConn = null;
mServiceBinder = null;
super.onDestroyView();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
Log.d("Fragment", "onViewCreated");
Button showButton = (Button) view.findViewById(R.id.button);
Button hideButton = (Button) view.findViewById(R.id.btnHide);
showButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Fragment", "onCLick");
mServiceConn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d("serviceConn", "onConnected");
mServiceBinder = (TestService.TestBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d("serviceConn", "onDisconnected");
}
};
Intent service = new Intent(getActivity(), TestService.class);
getActivity().startService(service);
getActivity().bindService(service, mServiceConn, Context.BIND_ABOVE_CLIENT);
}
});
hideButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
mServiceBinder.stop();
}
});
}
}
答案 0 :(得分:0)
通知会重新显示,因为您的服务在活动结束后调用了onStartCommand
。
这是一个创建和显示通知的好地方。 onStartCommand
方法可能多次调用。例如,将通知创建放在onCreate
。
当你写“应用程序没有被销毁”时,你是什么意思?如果您在服务运行时考虑过,请将创建内容放到onCreate
并在onDestroy
中将其删除。
答案 1 :(得分:0)
返回START_STICKY
代替super.onStartCommand(intent, flags, startId)
,这是我应该做的。