标签: android-service

控制Android或任何其他音乐播放器的默认音乐播放器

如何控制Android或任何其他播放器的默认音乐播放器?通过控制我的意思是暂停,播放,下一个等等.我必须绑定服务吗?我试图使用IMediaPlaybackService它,但它不起作用.因为我在Android市场上看到了控制音乐播放器的应用程序,所以肯定有一条出路.任何的想法?

android android-service

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

将服务绑定到活动或片段?

我正在开发一个音乐播放器应用程序.我有一个主要的活动,有多个片段,每个片段在设备专辑上显示歌曲,艺术家明智等.
我有一个音乐服务,处理所有播放和其他东西.
我感到困惑的是这个服务与我拥有的各种片段的绑定.
现在我将主要活动和每个片段分别与服务绑定,并且它的工作非常好.但我想知道这是否真的是最好的做法?有没有办法将主活动与服务绑定,然后一些如何在其子片段中使用它?
我可能错过了一些非常基本的活动概念或片段或服务.所以有人请在这方面指导我.
我想这更像是一个概念性问题,因此不需要任何代码.但如果需要,请告诉我.

编辑:
我的问题是:什么是一个更好的方法来绑定一个具有多个子片段(每个将使用该服务)的活动的服务?

android android-service android-fragments

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

即使我正在释放它,WakeLock仍然保持错误但最终确定

我有一个应该在后台运行的服务.它在我的应用程序打开时启动,并在用户关闭我的应用程序时结束.

每当我的应用程序在后台或屏幕关闭时,我仍然需要运行该服务.

我用WakeLock实现了这一点,但由于某种原因我在标题中得到了错误.

这是令人担忧的,因为我可能是内存泄漏了WakeLock(如果我理解正确的话).

我可以通过重新启动我的应用程序来触发错误.

这是相关代码:

public class SomeService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);

        PowerManager manager = (PowerManager) getSystemService(POWER_SERVICE);

        mWakeLock = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TAG");

        if (!mWakeLock.isHeld()) mWakeLock.acquire();

        //Handle other processing

        return START_STICKY;
    }

    @Override
    public void onDestroy() {

        if (mWakeLock.isHeld()) mWakeLock.release();
        super.onDestroy();
    }

}
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为onDestroy()我发布了WakeLock.我不确定是什么触发了这个错误.

android android-service android-wake-lock wakelock

20
推荐指数
1
解决办法
2868
查看次数

如何在应用关闭时停止Android服务

我正在努力让服务不断运行,直到用户关闭应用程序.

我使用的是startService()从方法onCreate()我的主要活动的方法,并stopService()onDestroy()方法.

现在我有问题了,因为看起来我的主要活动已经死亡并且在我旋转设备或关闭屏幕时重新创建.

仅当用户手动停止应用程序时,如何停止我的服务?

service android android-service

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

如何保持我的BroadcastReceiver

目前我正在开发一个类似Truecaller的呼叫拦截器应用程序.

我需要什么

即使我的应用程序已从最近的应用程序列表中删除,我也想检测来电.

Manifest.xml代码

<receiver android:name=".PhoneStateReceiver">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

我的广播接收器代码

@Override
public void onReceive(Context context, Intent intent) {
  //my call blocking code
}
Run Code Online (Sandbox Code Playgroud)

我的问题

我的BroadcastReceiver不会在后台工作,就像我从最近的应用列表中删除一样.

我的完整清单代码在这里

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ranjith.callblocker">

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

<uses-permission android:name="android.permission.GET_TASKS" />

<application
    android:allowBackup="true"
    android:enabled="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <receiver
        android:name=".PhoneStateReceiver"
        android:enabled="true"
        android:exported="true"
        android:process=":anotherProcess">
        <intent-filter android:priority="1000">
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
    </receiver>
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application> …
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-service android-broadcastreceiver

20
推荐指数
1
解决办法
5289
查看次数

如何停止运行服务?

我有这个描述服务的代码:

public class navigation_web extends Service {

    Context context;

    public void navigation() {
        Cursor mCur = getContentResolver().query(Browser.BOOKMARKS_URI,
            Browser.HISTORY_PROJECTION, null, null, null);
        mCur.moveToFirst();
        if (mCur.moveToFirst() && mCur.getCount() > 0) {
            while (mCur.isAfterLast() == false) {
                Log.v("titleIdx",
                    mCur.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX));
                Log.v("urlIdx",
                    mCur.getString(Browser.HISTORY_PROJECTION_URL_INDEX));
                mCur.moveToNext();
            }
        }
        // Browser.clearSearches(getContentResolver());
    }

    public void onCreate() {
        // Browser.clearHistory(getContentResolver());
        // Browser.clearSearches(getContentResolver());
        navigation();
        // super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public …
Run Code Online (Sandbox Code Playgroud)

android android-service

19
推荐指数
2
解决办法
6万
查看次数

为什么我不应该使用消息总线而不是加载器和服务?

在典型的Android项目中,我们需要以干净的方式将数据从某个地方(REST,SQL,缓存等)提取到UI中,我们通常使用Loader,Service或(可能是yuk)AsyncTask,但我发现所有这些方法由于以下几个原因不满意:

  • 它们很难看,尤其是具有令人震惊的API结构的Loaders
  • 它很容易被包裹在线程中,并踩在UI线程上
  • 我们的表示层代码被Android代码和样板文件污染了.我们经常将Android对象(例如Cursors)传递到UI层,这使得一个干净的架构几乎无法实现.这迫使我们将业务领域特定代码(理想情况下是普通的Java对象)与Android平台代码混合在一起 - 对于未来开发的可读性,维护,测试或灵活性来说并不是很好.在实践中,我们经常会遇到庞大,混乱的Activity/Fragment类.

我被这些文章中概述的想法所吸引:http : //fernandocejas.com/2014/09/03/architecting-android-the-clean-way/ http://antonioleiva.com/mvp-android/ http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html

成功开始使用MVP将活动/碎片/视图分解为更小/更清洁的部分,我现在认为上述问题的解决方案可能是依赖于消息总线(Otto,EventBus等)而不是服务或加载器或任何与域数据交互的内容.

所以在实践中这意味着不是使用(例如)CursorLoader从数据库加载Cursor,而是使用消息总线发送消息来请求数据,数据被加载到后台线程以响应该消息,然后通过UI线程上的消息到达时处理响应数据.对我来说至关重要的是,我希望将数据结构从业务领域推出,而不是Android域,所以我更喜欢业务对象数组,而不是Cursor.

这是工程设计,总是需要权衡,虽然这似乎提供了更清晰的关注点分离,但是装载机/服务模板的减少,缺点是什么?

  • 理解代码可能更难(特别是对于新开发人员而言)
  • 有必要确保在正确的线程上发送和接收消息(Otto似乎在这里可能有限制)
  • 有必要避免将一切事物作为一种信息实施的诱惑,这最终会适得其反
  • 传递业务对象集合可能不如使用像Cursors这样的对象.虽然在许多情况下它在实践中是一个问题吗?
  • 我不知道Otto/EventBus是否只是为了传递非常小的消息,或者是否适合传递更大的对象(例如业务对象数组).

我的问题是,是否有任何基本原因不采用这种基于消息的Android应用程序方法?

android android-service android-cursor android-testing android-cursorloader

19
推荐指数
1
解决办法
1782
查看次数

即使应用程序关闭,如何保持IntentService运行?

在我的Android应用程序中,我通过调用从Activity中启动IntentService

startService(new Intent(this, MyService.class));
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力.我可以在Activies之间移动,按Home键切换到其他应用程序......它仍然有效.但是如果我从最近的屏幕上删除我的应用程序,我的服务就会停止.我怎么能避免这个?换句话说,即使我的应用程序已从最近的应用程序关闭,如何保持我的服务运行?

我的服务代码如下:

public class MyService extends IntentService {

public MyService() {
    super("MyService");
}

@Override
protected void onHandleIntent(Intent intent) {
    //Here I run a loop which takes some time to finish
}

}
Run Code Online (Sandbox Code Playgroud)

android android-service intentservice android-intentservice

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

打盹模式如何影响后台/前台服务,有/无部分/完整唤醒锁?

这是一个简单的问题,看到G +(这里)有关于此的大量帖子,以及官方文档(这里)缺乏信息:

当设备进入"打盹"模式时,应用程序的服务会发生什么变化?

它对后台/前台服务(绑定/未绑定,已启动/未启动)有什么作用,有/无部分/完整唤醒锁?

例如,为了创建在设备屏幕关闭时播放音频流的服务,您会做什么?如果音频流不是来自本地文件,而是来自网络,该怎么办?

看到Google开发者声称:

已经运行前台服务的应用程序(带有相关通知)不受打盹的限制.

- 之后进行了大量的讨论,声称这并不完全正确,我认为知道特殊的后台操作应用程序应该做什么是相当令人困惑的.

android android-service android-doze-and-standby android-doze

19
推荐指数
1
解决办法
5848
查看次数

如何取消前台服务使用通知(轻扫解除)或清除所有通知?

我正在创建一个前台服务,其中包含服务启动时通知栏中显示的通知.如果服务停止,通知将解除.我的问题是,当"清除所有通知"或解除通知(滑动)时,有没有办法停止服务?

更新以包括通知的实施:

public int onStartCommand(Intent intent, int flags, int startId)
{   
    Log.d(CLASS, "onStartCommand service started.");

    if (getString(R.string.service_start_action) == intent.getAction())
    {
        Intent intentForeground = new Intent(this, ServiceMain.class)
            .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);    
        PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intentForeground, 0);      
        Notification notification;
        Notification.Builder builder = new Notification.Builder(getApplicationContext())
            .setSmallIcon(android.R.drawable.btn_star)
            .setTicker("Service started...")
            .setContentIntent(pendIntent)
            .setDefaults(Notification.DEFAULT_ALL)
            .setOnlyAlertOnce(true)
            .setOngoing(false);
        notification = builder.build();
        notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;

        startForeground(SERV_NOTIFY, notification);
        player.start();
    }
    else
    {
        Log.d(CLASS, "onStartCommand unable to identify acition.");
    }

    return START_STICKY;        
}
Run Code Online (Sandbox Code Playgroud)

android android-service android-notifications

18
推荐指数
4
解决办法
2万
查看次数