2011-01-07 11 views
13

Tôi đang viết một Widget sẽ hiển thị đồng hồ đếm ngược. Tôi có các widget làm việc theo cách tôi muốn nó cho đến khi tôi lật điện thoại từ phong cảnh đến chân dung. Tiện ích của tôi không cập nhật và chuyển đến trạng thái ban đầu của nó khi bắt đầu tiện ích cho đến khi một cập nhật được gọi bằng báo thức định kỳ của tôi. Tôi muốn gọi một onupdate bằng tay một khi định hướng thay đổi để cập nhật widget của tôi, tôi đã nghiên cứu điều này trong một thời gian và tôi đã phát hiện ra rằng tôi cần sử dụng một Dịch vụ sẽ theo dõi các thay đổi định hướng và gọi cho onupdate của tôi tiện ích của tôi.Làm cách nào để sử dụng dịch vụ để theo dõi sự thay đổi Định hướng trong Android

Vấn đề của tôi là tôi không thể tìm thấy câu trả lời thẳng về cách sử dụng dịch vụ để theo dõi thay đổi. Tôi đã thấy rằng với một hoạt động tôi có thể thêm android: configChanges = "orientation | keyboardHidden" vào tệp kê khai cho hoạt động và sử dụng onConfigurationChanged, nhưng tôi có thể làm điều này cho một dịch vụ. Nếu thế thì sao? Có cách nào tốt hơn để theo dõi sự thay đổi định hướng? Tôi cũng đã đọc trên internet rằng một dịch vụ không phải là cách tốt nhất để làm điều này.

Tôi đã xem hướng dẫn để tạo trình nghe định hướng nhưng dường như chúng sử dụng các cuộc gọi hàm bị khấu hao.

Cảm ơn trước

+0

bạn đã bao giờ tìm thấy một giải pháp tốt cho việc này? – Patrick

Trả lời

1

Bạn có thể tạo một BroadcastReceiver rằng lắng nghe cho Intent.ACTION_CONFIGURATION_CHANGED (android.intent.action.CONFIGURATION_CHANGED)

Lưu ý rằng nó nói:

Bạn có thể không nhận được này thông qua các thành phần được khai báo trong tệp kê khai, chỉ bằng cách đăng ký một cách rõ ràng với Context.registerReceiver().

Điều đó có nghĩa là bạn không thể đăng ký người nhận trong tệp kê khai. Bạn sẽ phải đăng ký nó trong mã.

sau đó nhận cấu hình và kiểm tra hướng mà Floern đã nêu.

+0

Có thể _Intent.ACTION_CONFIGURATION_CHANGED_ đến appwidgetprovider vì nó là bộ thu phát sóng được sửa đổi? Tôi đoán là không. Khi tôi tạo bộ thu phát sóng, tôi có cần khởi động nó ở đâu đó hay nó sẽ tự động khởi động khi Widget của tôi khởi động? – Dysen

+0

Cuối cùng tôi đã tìm ra cách để thực hiện những gì bạn nói về. Câu hỏi tiếp theo của tôi là tại sao tôi đăng ký người nhận trong một dịch vụ? sẽ không thoát khỏi dịch vụ sau khi đăng ký? Tôi có thể đăng ký Người nhận trong hoạt động widgetconfiguration không? Liệu thực thể đã đăng ký bộ thu phát sóng có phải nằm trong bộ nhớ để nó chạy không? – Dysen

13

Vui lòng tìm bên dưới ví dụ về những gì bạn yêu cầu, hy vọng điều này sẽ hữu ích.

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)); 
    } 
} 

và ở đây có lớp 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"); 
       } 
      } 
     } 
    }; 
} 

và đây là phần để xác định MyService trong file manifest

<!-- 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

Vấn đề là điều này sẽ chỉ hoạt động nếu ứng dụng hỗ trợ xoay vòng. Vì vậy, nếu trình khởi chạy của bạn không hỗ trợ xoay sang ngang, nó sẽ không hoạt động từ một dịch vụ. Tôi đoán sẽ sử dụng các cảm biến để có được nó, nhưng tôi không chắc chắn làm thế nào. –

+0

@WareNinja: Thông tin bên trên không hoạt động nếu người dùng đã thay đổi hướng thủ công bằng cách nhấp vào nút "Xoay tự động" trên thanh thông báo. – ChuongPham

+0

@ChuongPham: Xoay tự động và thay đổi hướng thủ công? bạn có thể vui lòng giải thích thêm, nó khó hiểu những gì bạn đã cố gắng để nói? – xmen

0

tôi sẽ đề nghị bạn sử dụng một đối tượng OrientationEventListener. Nó thực hiện chính xác những gì bạn đang tìm kiếm và nó không được chấp nhận. Đó là khoảng từ cấp API 3.

+0

OrientationEventListener không hoạt động nếu người dùng thay đổi hướng thủ công bằng cách nhấp vào nút "Xoay tự động" trên thanh thông báo và để điện thoại phẳng trên bề mặt. Nó sẽ chỉ hoạt động nếu người dùng nhấc điện thoại lên và di chuyển/xoay nó. – ChuongPham

20

Service#onConfigurationChanged(Configuration newConfig) phù hợp với tôi. Không cần phải đăng ký nhận cho ý kiến ​​của tôi. Tôi cũng không thêm bất kỳ bộ lọc nào vào AndroidManifest. Tôi đã bỏ lỡ điều gì đó trong cuộc thảo luận vì không ai đề xuất giải pháp này? Dịch vụ của tôi đang chạy trên nền trước.

Chỉ cần đặt bên trong dịch vụ của bạn:

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

Có tác dụng này và đơn giản hơn nhiều so với việc đăng ký mục đích phát sóng! – Flyview