如何使用服务监视Android中的方向更改
我正在编写一个将显示倒数计时器的Widget。我按照自己需要的方式工作,直到将手机从横向翻转到纵向。我的小部件不会更新,并会在小部件开始时进入初始状态,直到我的循环警报调用onupdate。我想在手动更改我的小部件后手动调用onupdate我已经研究了一段时间,并且发现我需要使用服务来监视方向更改并将我的onupdate我的小部件。如何使用服务监视Android中的方向更改
我的问题是我无法找到一个直接的答案,如何使用服务来监视变化。我见过有一个活动,我可以添加机器人:configChanges =“方向| keyboardHidden”到清单的活动并使用onConfigurationChanged,但我能做到这一点的服务。如果是这样如何?有没有更好的方法来监视方向变化?我也在互联网上读到,服务不是实现这一目标的最佳方式。
我已经看到了创建定向听众教程,但他们似乎利用折旧函数调用。
由于提前
您可以创建一个BroadcastReceiver侦听Intent.ACTION_CONFIGURATION_CHANGED(android.intent.action.CONFIGURATION_CHANGED)
请注意,它说:
你不能收到此通过 清单中声明的组件,只有 通过明确注册 Context.registerReceiver()。
这意味着您无法在清单文件中注册您的接收器。你将不得不在代码中注册它。
然后获取配置,并检查Floern说的方向。
请在下面找到一个你要求的例子,希望这有助于你。
public class ScreenOrientationListener extends Activity {
private static final String TAG = "ScreenOrientationListener";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
setContentView(R.layout.main);
startService(new Intent(this, MyService.class));
}
}
和这里来的MyService类
public class MyService extends Service {
private static final String TAG = "MyService";
private static final String BCAST_CONFIGCHANGED = "android.intent.action.CONFIGURATION_CHANGED";
private static Context mContext;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Log.d(TAG, "onCreate()");
mContext = this;
IntentFilter filter = new IntentFilter();
filter.addAction(BCAST_CONFIGCHANGED);
this.registerReceiver(mBroadcastReceiver, filter);
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy()");
//Unregister receiver to avoid memory leaks
mContext.unregisterReceiver(mBroadcastReceiver);
}
@Override
public void onStart(Intent intent, int startid) {
Log.d(TAG, "onStart()");
}
public BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent myIntent) {
if (myIntent.getAction().equals(BCAST_CONFIGCHANGED)) {
Log.d(TAG, "received->" + BCAST_CONFIGCHANGED);
if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
// it's Landscape
Log.d(TAG, "LANDSCAPE");
}
else {
Log.d(TAG, "PORTRAIT");
}
}
}
};
}
,这里是清单文件定义为MyService
<!-- Services -->
<service android:enabled="true" android:name="com.wareninja.android.external.screenorientationlistener.services.MyService">
<intent-filter>
<action android:name="android.intent.action.CONFIGURATION_CHANGED"/>
</intent-filter>
</service>
问题是只有当应用程序支持旋转时,这才会起作用。所以如果你的启动器不支持旋转到横向,它将无法从服务中工作。我的猜测是使用传感器来获取它,但我不知道如何。 – 2012-02-09 23:50:06
@WareNinja:如果用户通过单击通知栏中的“自动旋转”按钮手动更改方向,则上述操作不起作用。 – ChuongPham 2012-08-12 18:19:15
Service#onConfigurationChanged(Configuration newConfig)
适合我。无需为我的意见注册Receivers。我也没有添加任何过滤器到AndroidManifest。由于没有人提出这个解决方案,我是否错过了讨论的内容?我的服务正在前台运行。
只需将您的服务中:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//Your handling
}
你有没有找到这个好的解决办法? – Patrick 2013-06-05 13:19:17