将服务绑定到vs将其绑定到绑定是否有任何根本区别.我想将服务绑定到a,因为我想在Application中保留一些全局状态/数据,而不是在我的所有活动中复制它.android.app.Activityandroid.app.ApplicationApplication
谢谢.
我有一项活动通过调用启动的服务的情景startService方法:无论是Activity和Service是在同一个包.然后,服务根据其配置参数,可以启动ExternalActivity包含在不同包中的活动(让我们称之为):此活动通过以下方式绑定服务bindService; 一旦这个活动完成了它的任务,就会调用以下unbindService方法......
// method of ExternalActivity
@Override
public void onDestroy() {
super.onDestroy();
unbindService(...);
}
Run Code Online (Sandbox Code Playgroud)
结果,该服务也被销毁.是否有可能避免破坏服务?
我正在尝试在后台运行服务.我的应用程序所做的是当用户检查复选框然后服务启动时以及取消选中时服务停止.哪个工作得很好.但问题是,当我从任务管理器关闭应用程序时,它也会停止服务.我想要的是即使它从任务管理器关闭后仍保持服务运行.然后,只有通过取消方框才能让用户自己停止该服务.
我怎样才能做到这一点?
这是我的代码
我的主要活动
public class SampleServiceActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final CheckBox cb = (CheckBox) findViewById(R.id.checkBox1);
cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if(isChecked) {
Toast.makeText(getBaseContext(), "Checked", Toast.LENGTH_LONG).show();
startService(new Intent(getBaseContext(), MyService.class));
} else {
Toast.makeText(getBaseContext(), "Unchecked", Toast.LENGTH_LONG).show();
stopService(new Intent(getBaseContext(), MyService.class));
}
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我的服务类
public class MyService extends Service {
Notify n = new Notify();
@Override
public IBinder …Run Code Online (Sandbox Code Playgroud) 我将非常感谢有关如何处理操作系统查杀长期服务的一些指导.
业务场景:
应用程序记录BTT轨道,可能持续数小时.它还可以在地图上显示轨道以及相关统计数据.
应用程序用户界面使用户能够开始/停止跟踪记录并在地图上查看实时跟踪.
在开始跟踪记录之后,用户可以退出应用程序并关闭屏幕(以节省电量),并且只有服务将保持运行以保持记录更新到数据库(显示通知),直到用户再次启动活动并要求停止记录,这导致服务终止.
问题:
在可变时间(从40分钟到1个半小时)之后,录制服务在没有任何警告的情况下被杀死.由于BTT出场可能需要几个小时,这导致跟踪录音不完整.
一些其他信息:
服务以启动START_STICKY并获取PARTIAL_WAKE_LOCK,并在与主活动相同的过程中运行.
以用户定义的速率从1秒到几分钟获取(并记录)新位置.我从Android文档中了解到,这是长期运行服务的预期操作系统行为.
题:
拥有性能良好的应用程序以满足业务场景要求的最佳架构设计方法是什么?
我可以想到几个选项(我不喜欢它们中的任何一个),但我希望某人如何面对并解决类似问题的指导:
感谢所有能够就此主题分享一些智慧的人.
是)我有的:
我有一个使用aidl在进程上运行的库.我有一个使用此库的应用程序,在消息传递活动中,我连接服务以发送消息,我有一个广播接收器来管理传入的消息.
问题?
如果这个库将由同一设备上的两个应用程序使用,则广播操作将是相同的,并且当我发送广播时我将遇到问题.
我有什么疑问?
什么是"收听"我在我的库中收到的新传入消息并将其发送到应用程序的最佳方式.也许回调?还是有更好的解决方案?
更多信息
该库提供了一些启动会话的方法,以及用于发送不同类型的消息(图像,文本,位置等等)的其他方法,并且我从另一个库中接收回调,该库使用C和C++,当一个新的消息传入.
如果您需要更多信息,请随时提出.
我的代码:
IRemote.aidl
interface IRemote
{
int sendTextMessage(String to, String message);
}
Run Code Online (Sandbox Code Playgroud)
WrapperLibrary.java
public class MyLibrary extends Service {
// Current context, used to sendbroadcast() from @Callbacks
private Context mContext = this;
private static MyLibrary instance = new MyLibrary();
//Executor to start a new thread from the service.
final ExecutorService service;
@Override
public IBinder onBind(Intent arg0) {
//Return the interface.
return mBinder;
}
/** Return the current instance */
public static WrapperLibrary …Run Code Online (Sandbox Code Playgroud) 服务已实现onTaskRemoved()方法.
当通过swipe从recent-apps-list中删除应用程序时调用startService()onTaskRemoved()时启动服务.
但是如果服务以bindService()开头,则onTaskRemoved()从不调用.
如何在使用bindService()启动应用程序后,通过轻扫将应用程序从recent-apps-list中删除,从而调用onTaskRemoved()?
以下方法调用如果以下:
1. bindService():
Activity? onCreate()
CustomService? onCreate()
CustomService? onStart()
CustomService? onStartCommand()
CustomService? onBind()
// Here we swipe to remove app from recent-apps-list
CustomService? onTrimMemory()
2. startService():
ActivityA? onCreate()
CustomService? onCreate()
CustomService? onStart()
CustomService? onStartCommand()
CustomService? onBind()
// Swipe to remove app from recent-apps-list
CustomService? onTrimMemory()
CustomService? onTaskRemoved() // <=====
CustomService? onUnbind()
Run Code Online (Sandbox Code Playgroud) 我有一个BroadcastReceiver并声明它是这样的:
<receiver
android:name="com.services.Receiver"
android:enabled="true"
android:exported="true" >
<intent-filter android:priority="999" >
<action android:name="android.intent.action.WALLPAPER_CHANGED" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
接收者是:
@Override
public void onReceive(final Context context, final Intent intent)
{
change_wallpepar.myPrefs = context.getSharedPreferences("myPrefs", Context.MODE_PRIVATE);
new Handler().postDelayed(new Runnable()
{
@Override
public void run()
{
Log.d("MAYUR", "<< wallpepar changed >>");
if (change_wallpepar.myPrefs.getLong("temp_for_change", 1) == 0)
{
context.stopService(new Intent(context, change_wallpepar.class));
}
else
{
SharedPreferences.Editor e = change_wallpepar.myPrefs.edit();
e.putLong("temp_for_change", 0);
e.commit();
}
}
}, 4000);
}
Run Code Online (Sandbox Code Playgroud)
当我在这里更改壁纸时,它应该被调用一次.它实际上是按照我的期望工作了一段时间,在几分钟后它会调用onreceive()多次(10-18)次,即使壁纸的更改已完成一次.更奇怪的是,它在三星Galaxy平板电脑版本4.4.2上运行良好,但不适用于摩托罗拉(Moto E 4.4.4).
我的服务:
public class change_wallpepar extends Service {
@Override …Run Code Online (Sandbox Code Playgroud) 我已经实现了一个服务,我处理状态更改(连接,断开连接,onServiceDiscoverd,onCharacteristicChange等)并通过gatt服务器从另一个设备接收数据.
我的问题是,使用Greenrobot Eventbus 在服务和活动之间替换广播接收器可以有效地处理事件吗?
android android-service bluetooth-lowenergy android-broadcast greenrobot-eventbus
我的应用程序依赖Service于在后台与外部硬件保持同步的应用程序.因为服务在主线程上运行,所以它使用IntentService异步执行任何繁重的工作.以下是解释控制流的代码的最小化示例:
public class MyService extends Service {
private final Handler handler = new Handler();
void someMethodDoesCallBarAsynchronously(){
Intent i = new Intent(this, MyIntentService.class);
i.putAction(ACTION_FOO);
i.putExtra(EXTRA_RECEIVER, new MyResultReceiver(handler));
startService(toGetScannerStatus);
}
void receivedFooResult(String bar){
//...
}
public class MyResultReceiver extends ResultReceiver{
public MyResultReceiver(Handler handler){
super(handler);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
super.onReceiveResult(resultCode, resultData);
switch(resultCode){
case RESULT_CODE_FOO:
receivedFooResult(resultData.getString(FOO_RESULT));
break;
}
}
}
}
public class MyIntentService extends IntentService {
public MyIntentService(){super("MyIntentService");}
@Override
protected void onHandleIntent(Intent intent) { …Run Code Online (Sandbox Code Playgroud) 从Android Pie(API 28)开始,Google不允许在2个不同的进程中使用单个WebView实例。
根据要求,我打电话给我,WebView.setDataDirectorySuffix("dir_name_no_separator")但不幸的是,我得到了一个例外。我试图在第二个进程Service onCreate()中调用此方法。
java.lang.RuntimeException: Unable to create service com.myapp.service.MyService: java.lang.IllegalStateException: Can't set data directory suffix: WebView already initialized
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3544)
at android.app.ActivityThread.access$1300(ActivityThread.java:199)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1666)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.IllegalStateException: Can't set data directory suffix: WebView already initialized
at android.webkit.WebViewFactory.setDataDirectorySuffix(WebViewFactory.java:136)
at android.webkit.WebView.setDataDirectorySuffix(WebView.java:2165)
at com.myapp.service.MyService.onCreate(MyService.java:134)
Run Code Online (Sandbox Code Playgroud)
我找不到该异常的任何原因。我没有两次调用此方法,也没有在主过程中调用它。有任何想法吗?