标签: android-service


防止Android服务在解除绑定后被销毁

我有一项活动通过调用启动的服务的情景startService方法:无论是ActivityService是在同一个包.然后,服务根据其配置参数,可以启动ExternalActivity包含在不同包中的活动(让我们称之为):此活动通过以下方式绑定服务bindService; 一旦这个活动完成了它的任务,就会调用以下unbindService方法......

// method of ExternalActivity
@Override
public void onDestroy() {
    super.onDestroy();
    unbindService(...);
}
Run Code Online (Sandbox Code Playgroud)

结果,该服务也被销毁.是否有可能避免破坏服务?

android android-service

17
推荐指数
1
解决办法
2万
查看次数

即使应用程序被强制停止也会重新启动服务,即使在关闭应用程序后仍然在后台继续运行服务如何?

我正在尝试在后台运行服务.我的应用程序所做的是当用户检查复选框然后服务启动时以及取消选中时服务停止.哪个工作得很好.但问题是,当我从任务管理器关闭应用程序时,它也会停止服务.我想要的是即使它从任务管理器关闭后仍保持服务运行.然后,只有通过取消方框才能让用户自己停止该服务.

我怎样才能做到这一点?

这是我的代码

我的主要活动

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)

java android android-service

17
推荐指数
3
解决办法
3万
查看次数

Android上长期运行服务的最佳架构

我将非常感谢有关如何处理操作系统查杀长期服务的一些指导.

业务场景:

应用程序记录BTT轨道,可能持续数小时.它还可以在地图上显示轨道以及相关统计数据.

应用程序用户界面使用户能够开始/停止跟踪记录并在地图上查看实时跟踪.

在开始跟踪记录之后,用户可以退出应用程序并关闭屏幕(以节省电量),并且只有服务将保持运行以保持记录更新到数据库(显示通知),直到用户再次启动活动并要求停止记录,这导致服务终止.

问题:

在可变时间(从40分钟到1个半小时)之后,录制服务在没有任何警告的情况下被杀死.由于BTT出场可能需要几个小时,这导致跟踪录音不完整.

一些其他信息:

服务以启动START_STICKY并获取PARTIAL_WAKE_LOCK,并在与主活动相同的过程中运行.

以用户定义的速率从1秒到几分钟获取(并记录)新位置.我从Android文档中了解到,这是长期运行服务的预期操作系统行为.

题:

拥有性能良好的应用程序以满足业务场景要求的最佳架构设计方法是什么?

我可以想到几个选项(我不喜欢它们中的任何一个),但我希望某人如何面对并解决类似问题的指导:

  • 使用广播接收器(理想情况下,如果可能,连接到位置管理器)使服务仅在获取新位置时运行?
  • 不要让用户离开主要活动(导致用户体验下降)?
  • 如果需要,让警报广播接收器重新启动服务吗?

感谢所有能够就此主题分享一些智慧的人.

service android android-service android-lifecycle

17
推荐指数
1
解决办法
3976
查看次数

与活动通信的最佳方式(广播,回调等)

是)我有的:

我有一个使用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)

performance android android-service android-broadcast

17
推荐指数
2
解决办法
1749
查看次数

服务:如果使用bindService启动,则不会调用onTaskRemoved

服务已实现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)

android android-service android-service-binding

17
推荐指数
1
解决办法
1万
查看次数

BroadcastReceiver for WALLPAPER_CHANGED多次调用onReceive():Android

我有一个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)

android android-service android-broadcast android-wallpaper

17
推荐指数
1
解决办法
1043
查看次数

用Greenrobot Eventbus替换广播接收器以触发基于事件的功能和从服务到活动的数据传输是否有用?

我已经实现了一个服务,我处理状态更改(连接,断开连接,onServiceDiscoverd,onCharacteristicChange等)并通过gatt服务器从另一个设备接收数据.

我的问题是,使用Greenrobot Eventbus 在服务和活动之间替换广播接收器可以有效地处理事件吗?

android android-service bluetooth-lowenergy android-broadcast greenrobot-eventbus

17
推荐指数
1
解决办法
6164
查看次数

Android Service扩展了ResultReceiver for IntentService,如何实现CREATOR?

我的应用程序依赖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 android-service intentservice android-intentservice

17
推荐指数
1
解决办法
7112
查看次数

多进程Android Pie(9.0)WebView

从Android Pie(API 28)开始,Google不允许在2个不同的进程中使用单个WebView实例。

说明文件: https //developer.android.com/reference/android/webkit/WebView.html#setDataDirectorySuffix(java.lang.String)

根据要求,我打电话给我,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)

我找不到该异常的任何原因。我没有两次调用此方法,也没有在主过程中调用它。有任何想法吗?

android multiprocessing android-service android-9.0-pie

17
推荐指数
2
解决办法
5682
查看次数