2011-01-07 17 views
13

我正在编写一个将显示倒数计时器的Widget。我按照自己需要的方式工作,直到将手机从横向翻转到纵向。我的小部件不会更新,并会在小部件开始时进入初始状态,直到我的循环警报调用onupdate。我想在手动更改我的小部件后手动调用onupdate我已经研究了一段时间,并且发现我需要使用服务来监视方向更改并将我的onupdate我的小部件。如何使用服务监视Android中的方向更改

我的问题是我无法找到一个直接的答案,如何使用服务来监视变化。我见过有一个活动,我可以添加机器人:configChanges =“方向| keyboardHidden”到清单的活动并使用onConfigurationChanged,但我能做到这一点的服务。如果是这样如何?有没有更好的方法来监视方向变化?我也在互联网上读到,服务不是实现这一目标的最佳方式。

我已经看到了创建定向听众教程,但他们似乎利用折旧函数调用。

由于提前

+0

你有没有找到这个好的解决办法? – Patrick 2013-06-05 13:19:17

回答

1

您可以创建一个BroadcastReceiver侦听Intent.ACTION_CONFIGURATION_CHANGED(android.intent.action.CONFIGURATION_CHANGED)

请注意,它说:

你不能收到此通过 清单中声明的​​组件,只有 通过明确注册 Context.registerReceiver()。

这意味着您无法在清单文件中注册您的接收器。你将不得不在代码中注册它。

然后获取配置,并检查Floern说的方向。

+0

是否有可能_Intent。ACTION_CONFIGURATION_CHANGED_到appwidgetprovider,因为它是一个修改过的广播接收器?我猜不是。当我创建广播接收器时,是否需要在某处启动它,或者当我的Widget启动时它会自动启动? – Dysen 2011-01-07 17:47:11

+0

我终于想出了如何实现你所谈论的内容。我的下一个问题是为什么我会将接收器注册到服务中?服务注册后不会退出吗?我可以在Widget配置活动中注册Receiver吗?注册广播接收机的实体是否必须留在内存中才能运行? – Dysen 2011-01-10 12:00:30

13

请在下面找到一个你要求的例子,希望这有助于你。

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> 
+0

问题是只有当应用程序支持旋转时,这才会起作用。所以如果你的启动器不支持旋转到横向,它将无法从服务中工作。我的猜测是使用传感器来获取它,但我不知道如何。 – 2012-02-09 23:50:06

+0

@WareNinja:如果用户通过单击通知栏中的“自动旋转”按钮手动更改方向,则上述操作不起作用。 – ChuongPham 2012-08-12 18:19:15

0

我会建议你使用OrientationEventListener对象的一部分。它完全符合您的要求,并且不被弃用。从API级别3开始已经有了。

20

Service#onConfigurationChanged(Configuration newConfig)适合我。无需为我的意见注册Receivers。我也没有添加任何过滤器到AndroidManifest。由于没有人提出这个解决方案,我是否错过了讨论的内容?我的服务正在前台运行。

只需将您的服务中:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    //Your handling 
}