如何控制Android或任何其他播放器的默认音乐播放器?通过控制我的意思是暂停,播放,下一个等等.我必须绑定服务吗?我试图使用IMediaPlaybackService它,但它不起作用.因为我在Android市场上看到了控制音乐播放器的应用程序,所以肯定有一条出路.任何的想法?
我正在开发一个音乐播放器应用程序.我有一个主要的活动,有多个片段,每个片段在设备专辑上显示歌曲,艺术家明智等.
我有一个音乐服务,处理所有播放和其他东西.
我感到困惑的是这个服务与我拥有的各种片段的绑定.
现在我将主要活动和每个片段分别与服务绑定,并且它的工作非常好.但我想知道这是否真的是最好的做法?有没有办法将主活动与服务绑定,然后一些如何在其子片段中使用它?
我可能错过了一些非常基本的活动概念或片段或服务.所以有人请在这方面指导我.
我想这更像是一个概念性问题,因此不需要任何代码.但如果需要,请告诉我.
编辑:
我的问题是:什么是一个更好的方法来绑定一个具有多个子片段(每个将使用该服务)的活动的服务?
我有一个应该在后台运行的服务.它在我的应用程序打开时启动,并在用户关闭我的应用程序时结束.
每当我的应用程序在后台或屏幕关闭时,我仍然需要运行该服务.
我用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.我不确定是什么触发了这个错误.
我正在努力让服务不断运行,直到用户关闭应用程序.
我使用的是startService()从方法onCreate()我的主要活动的方法,并stopService()在onDestroy()方法.
现在我有问题了,因为看起来我的主要活动已经死亡并且在我旋转设备或关闭屏幕时重新创建.
仅当用户手动停止应用程序时,如何停止我的服务?
目前我正在开发一个类似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
我有这个描述服务的代码:
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项目中,我们需要以干净的方式将数据从某个地方(REST,SQL,缓存等)提取到UI中,我们通常使用Loader,Service或(可能是yuk)AsyncTask,但我发现所有这些方法由于以下几个原因不满意:
我被这些文章中概述的想法所吸引: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.
这是工程设计,总是需要权衡,虽然这似乎提供了更清晰的关注点分离,但是装载机/服务模板的减少,缺点是什么?
我的问题是,是否有任何基本原因不采用这种基于消息的Android应用程序方法?
android android-service android-cursor android-testing android-cursorloader
在我的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) 这是一个简单的问题,看到G +(这里)有关于此的大量帖子,以及官方文档(这里)缺乏信息:
当设备进入"打盹"模式时,应用程序的服务会发生什么变化?
它对后台/前台服务(绑定/未绑定,已启动/未启动)有什么作用,有/无部分/完整唤醒锁?
例如,为了创建在设备屏幕关闭时播放音频流的服务,您会做什么?如果音频流不是来自本地文件,而是来自网络,该怎么办?
看到Google开发者声称:
已经运行前台服务的应用程序(带有相关通知)不受打盹的限制.
- 之后进行了大量的讨论,声称这并不完全正确,我认为知道特殊的后台操作应用程序应该做什么是相当令人困惑的.
android android-service android-doze-and-standby android-doze
我正在创建一个前台服务,其中包含服务启动时通知栏中显示的通知.如果服务停止,通知将解除.我的问题是,当"清除所有通知"或解除通知(滑动)时,有没有办法停止服务?
更新以包括通知的实施:
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)