2010-10-03 21 views
28

Tôi cố gắng để autostart ứng dụng nightclock tôi trên sạc sử dụng phương pháp BroadcastReceiver sau thực hiện trong onPause():startActivity() từ BroadcastReceiver

BroadcastReceiver test = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     unregisterReceiver(this); 
     Intent i = new Intent(context, NightClock.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 
    }   
}; 
registerReceiver(test, new IntentFilter(Intent.ACTION_POWER_CONNECTED)); 

Phương pháp onReceive() được kích hoạt khi USB-cáp là đã được cắm nhưng hoạt động không bắt đầu. Tuy nhiên nhật ký cho thấy điều này:

I/ActivityManager( 79): Starting activity: Intent { flg=0x10000000 cmp=com.meins.nightclock/.NightClock } 

Bất kỳ ý tưởng nào tại sao nhật ký cho biết hoạt động được bắt đầu nhưng không có gì xảy ra?

+0

Vui lòng cập nhật sự cố của bạn với nhiều thứ khác từ LogCat - một vài dòng trước dòng này và một vài dòng trước dòng này. Ngoài ra, tại sao 'FLAG_ACTIVITY_NEW_TASK'? Ngoài ra, có phải hoạt động đã đăng ký 'BroadcastReceiver' này vẫn tồn tại khi ACTION_POWER_CONNECTED xảy ra không? – CommonsWare

+0

Không còn dòng nào trong LogCat khi kết nối với nguồn điện. 'BroadcastReceiver' được đăng ký trong cùng một hoạt động mà nó sẽ bắt đầu. Hoạt động này vẫn đang chạy trong nền (ứng dụng LogCat đã được đưa ra trước). Nếu hoạt động này bị giết trong taskmanager, thì 'BroadcastReceiver' dường như không kích hoạt. Cách tiếp cận này để tự khởi động ứng dụng của tôi sai từ đầu? – Gubbel

Trả lời

16

Nếu mục tiêu của bạn là bạn muốn NightClock được bắt đầu bất cứ khi nào phát sóng ACTION_POWER_CONNECTED được gửi, cách tiếp cận sử dụng BroadcastReceiver của bạn là tốt. Tuy nhiên, không đăng ký nó từ một hoạt động. Thay vào đó, đăng ký nó trong manifest:

<receiver android:name=".OnPowerReceiver"> 
     <intent-filter> 
       <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> 
     </intent-filter> 
</receiver> 

Sau đó, có BroadcastReceiver của bạn như là một lớp công chúng Java (ở đây đặt tên OnPowerReceiver, mặc dù bạn có thể gọi nó là bất cứ điều gì bạn muốn), và có nó gọi startActivity().

Hãy nhớ rằng người dùng có thể không muốn bạn làm điều này. Có nhiều trường hợp khác để kết nối điện thoại với nguồn điện bên cạnh việc bắt đầu "đồng hồ đêm". Tôi khiêm tốn đề nghị bạn chỉ cần cho phép người dùng bắt đầu hoạt động của bạn thông qua màn hình chủ.

+0

Tôi đã đăng ký 'BroadcastReceiver' trong tệp kê khai như bạn đã nói với lời gọi này trong phương thức' onReceive() ':' context.startActivity (new Intent (context, NightClock.class)); 'Nhưng không có gì xảy ra khi tôi kết nối điện thoại cầm quyền. Thậm chí không có mục nhập nhật ký nào được thêm nếu tôi thêm 'Log.d (this.toString()," đang cố gắng bắt đầu ứng dụng ... ");' vào phương thức. – Gubbel

+2

@Gubbel: Rất tiếc. Hãy thử ''. Hầu hết thời gian, họ không có 'ACTION_' trong chuỗi, nhưng dường như họ làm điều này. – CommonsWare

+0

Nó hoạt động! Cảm ơn bạn. – Gubbel

46

Bạn có bối cảnh truyền như tham số để onRecieve() phương pháp, vì vậy chỉ cần sử dụng:

@Override 
public void onReceive(Context context, Intent intent) { 
    //start activity 
    Intent i = new Intent(); 
    i.setClassName("com.test", "com.test.MainActivity"); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 
} 

Nó hoạt động, tất nhiên bạn phải thay đổi gói và tên lớp hoạt động để của riêng bạn.

+2

Tại sao lại là downvote? Điều này có tệ không? Nó đã giúp tôi ra như vậy +1 như tôi không thể tìm thấy gì nói rằng đó là một cách tiếp cận xấu. – Mafro34

+0

@ Mafro34 Tôi vừa thử cách tiếp cận tương tự và lý do tôi nghĩ đó không phải là lý tưởng là lá cờ anh ấy đang thiết lập. Bởi vì trừ khi đây là những gì bạn muốn (chạy một nhiệm vụ mới) nó có thể nghiêm trọng gây rối với logic ứng dụng của bạn - nó đã làm với tôi anyway. Vì vậy, trừ khi đây là những gì bạn muốn tôi khuyên bạn nên tìm cách tiếp cận khác. – AgentKnopf

+5

@AgentKnopf Có vẻ như bạn không có nhiều lựa chọn: (từ http://developer.android.com/reference/android/content/Context.html#startActivity%28android.content.Intent,%20android.os.Bundle % 29): "Lưu ý rằng nếu phương thức này đang được gọi từ bên ngoài một Ngữ cảnh hoạt động, thì Mục đích phải bao gồm cờ khởi động FLAG_ACTIVITY_NEW_TASK. Điều này là do, mà không được bắt đầu từ Hoạt động hiện tại, không có nhiệm vụ nào tồn tại trong đó để đặt hoạt động mới và do đó nó cần phải được đặt trong nhiệm vụ riêng của mình. " – aberaud

-3

Từ Docs:

Đừng bắt đầu hoạt động từ thu phát sóng vì kinh nghiệm người dùng là chói tai; đặc biệt là nếu có nhiều hơn một người nhận. Thay vào đó, hãy xem xét hiển thị thông báo.

+0

Họ ghi đè điều này trong nhiều ứng dụng mặc định như báo thức và cuộc gọi đến. Vì vậy, nếu người dùng muốn điều này xảy ra, đó là cuộc gọi của anh ấy. Và câu trả lời của bạn không trả lời câu hỏi. – Dpedrinha

Các vấn đề liên quan