2012-04-26 29 views
5

Tôi có ứng dụng VOIP, tôi cần đăng nhập ứng dụng ở chế độ nền khi khởi động thiết bị.Android: Đăng nhập ứng dụng ở chế độ nền khi khởi động

Hiện tại, ứng dụng init của tôi được thực hiện trên UI Hoạt động (onCreate()).

Tôi có những điều sau đây trong tâm trí của tôi, bất cứ ai có thể giúp đỡ và rõ ràng nghi ngờ của tôi.

  1. Thiết kế dịch vụ phải đạt được nhiệm vụ này ??
  2. Service Remote(AIDL) hoặc Dịch vụ địa phương nào và tại sao?
  3. Tương tác UIService xảy ra như thế nào?
  4. Sau UI đang hoạt động nhận được cuộc gọi lại? UI hoặc Service?
  5. Tôi có nên tạo Service làm Controller của mình, nghĩa là Service đến UI dữ liệu Vượt qua ngược lại?

Ứng dụng mẫu: Skype.

Trả lời

5

Vì vậy, có nhiều cách để đạt được những gì bạn muốn, đó là vấn đề phù hợp với phong cách và thiết kế của bạn tốt hơn. Hy vọng rằng bạn sẽ thấy thông tin này hữu ích.

  1. Để ứng dụng đăng nhập dưới nền khi khởi động, có một vài tùy chọn. Điều đầu tiên bạn cần là một BroadcastReceiver được định nghĩa là người nhận trong tệp kê khai. Yêu cầu BroadcastReceiver nắm bắt mục đích ACTION_BOOT_COMPLETED. Từ đây, bạn có thể khởi chạy Dịch vụ của mình. Điều này dẫn đến # 2.

  2. Nếu tất cả những gì bạn đang làm là các cuộc gọi RESTful thì thực sự là một IntentService sẽ là lý tưởng. Sự khác biệt giữa IntentServiceService rất đơn giản: Một IntentService chạy khỏi chuỗi chính, thực hiện 'mã' của nó và chết. Một dịch vụ, tuy nhiên chạy trên các chủ đề chính (đây là một thực tế quan trọng) và dài chạy vì vậy nó đã được nói với stopSelf(). Để giải quyết vấn đề hơn nữa, một Dịch vụ cũng ít có khả năng bị giết hơn so với một Hoạt động (các thành phần ứng dụng bị giết để nhường chỗ cho bộ nhớ cho các ứng dụng mới được tung ra), tức là. nó có quyền ưu tiên cao hơn. Dịch vụ này cũng có thể được khai báo là dịch vụ foreground yêu cầu thông báo nhưng ưu tiên cao hơn nữa. Tôi nghĩ trong trường hợp của bạn một Dịch vụ sẽ hoàn hảo.

  3. Khi giao diện người dùng (Hoạt động) của bạn được mở, cách tốt nhất để kết nối với Dịch vụ sẽ là Binder. Điều này sẽ cho phép nhiều giao diện đến Dịch vụ từ các ứng dụng/thành phần khác nhau nếu cần thiết. AIDL là công cụ khá thú vị nhưng từ kinh nghiệm của tôi khó quản lý hơn vì tất cả các tham số phải là nguyên thủy hoặc Công cụ. AIDL cũng chậm hơn một cách kém hiệu quả vì nó thực sự là một dạng của IPC. Khi một dịch vụ được khởi động với một ý định, phương thức onStartCommand() được gọi. Nếu dịch vụ được khởi động bởi một ứng dụng cố gắng liên kết với nó thì phương thức onBind() được gọi. Nhưng bạn có thể bắt đầu Dịch vụ với và Intent và sau đó liên kết với nó. Nếu bạn thích phương pháp RESTful, nơi bạn chỉ có các cuộc gọi nhanh cho dữ liệu, bạn có thể sử dụng IntentService với ResultReceiver. This is a great article được viết về các ví dụ Google I/O và chỉ được triển khai tổng thể tốt nếu bạn quan tâm đến IntentService và ResultReceiver.

  4. Điều này tùy thuộc vào bạn. Sử dụng Binder hoặc AIDL Activity của bạn có thể gọi các phương thức Service giống như phương thức đối tượng trong đó 'callback' sẽ là phương thức trả về. Nếu bạn sử dụng một ResultReceiver hoạt động giao tiếp với người nhận sẽ là gọi lại. Bạn cũng có thể chỉ truyền Intents qua lại nhưng điều này có thể lộn xộn. Một lần nữa cho trường hợp của bạn cách tiếp cận Binder sẽ được tốt cũng như một người nhận.

  5. Hãy coi Dịch vụ là một mô hình trong hệ thống MVVM - sử dụng nó làm người trợ giúp để lấy dữ liệu, chứ không phải là điều kiểm soát logic của ứng dụng.

Xin lỗi nếu điều này có vẻ lộn xộn, có rất nhiều cách để đạt được những gì bạn đang tìm kiếm. Nó chỉ là một vấn đề của những gì phù hợp với tình hình của bạn tốt nhất những gì bạn 'cảm thấy' là tốt hơn. Chưa kể đến Android SDK là khá lớn. Tôi đã cố gắng đánh vào tất cả các chủ đề có thể giúp bạn. Chúc may mắn!

+0

Câu trả lời có liên quan đến Câu hỏi của tôi, Vì vậy, Đánh dấu nó là Trả lời .. Cảm ơn jjNford – NitZRobotKoder

+1

@NitZRobotKoder không có vấn đề gì, tất cả các dịch vụ và cách sử dụng có thể trở nên phức tạp. nó giúp để biết nơi để tìm kiếm phía trước. chúc may mắn! – jjNford

0

bạn có thể xác thực người dùng đăng nhập bằng dịch vụ nền gói com.javaorigin.android.sample.service;

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.Toast; 

public class MyService extends Service { 

    String tag="TestService"; 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Toast.makeText(this, "Service created...", Toast.LENGTH_LONG).show();  
     Log.i(tag, "Service created..."); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) {  
     super.onStart(intent, startId); 
     Log.i(tag, "Service started..."); 
    } 
    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(this, "Service destroyed...", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 


public class SampleAction extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState); 
     TextView view = new TextView(this);  
     view.setText("Service Test"); 
     Intent i = new Intent(); 
     i.setClassName("com.javaorigin.android.sample.service", 
     "com.javaorigin.android.sample.service.MyService"); 
     bindService(i, null, Context.BIND_AUTO_CREATE); 
     this.startService(i);  
     setContentView(view); 
    } 
} 
+0

Deepak, u r Bắt đầu hoạt động sau đó Bắt đầu dịch vụ..Ứng dụng của tôi nên đăng nhập mà không có giao diện người dùng .. – NitZRobotKoder

+0

sau đó là cách bạn nhận được tín dụng đăng nhập từ người dùng? –

+0

Hãy tưởng tượng một trường hợp người dùng đã đặt nó và cài đặt giống như không hỏi evertytime .. – NitZRobotKoder

1

Thử dịch vụ với bộ thu khởi động. Here is an example Tôi tìm thấy sau khi tìm kiếm nhanh trên google. Sau đó, hãy nhớ lưu trữ thông tin đăng nhập ở đâu đó khi ứng dụng bắt đầu. Không chắc chắn những gì bạn có thể gọi lại, vì vậy thực sự khó trả lời phần đó. Tôi sẽ nói rằng nếu các cuộc gọi lại sẽ ảnh hưởng đến giao diện người dùng thì hãy để hoạt động đưa họ đến khi nó khởi động. Nếu bạn cần một giao diện người dùng khi chỉ dịch vụ đang chạy, có thể là tốt nhất để ném lên một thông báo và yêu cầu nó gọi hoạt động thích hợp với dữ liệu gọi lại.

+0

@Mikelsrael Cảm ơn bạn đã nhập..Callabacks của bạn sẽ về Đăng nhập thành công/Thất bại hoặc mạng UP/Down vv .. Nhưng tôi đã không nhận được bối cảnh này của bạn Comment..ie "Nếu bạn cần một giao diện người dùng khi chỉ dịch vụ đang chạy, có thể là tốt nhất để ném lên một thông báo và gọi nó là hoạt động thích hợp với dữ liệu gọi lại. " – NitZRobotKoder

+1

@NitZRobotKoder Tôi đã nói một cách tốt để đối phó với việc thông báo cho người dùng là thông qua thanh thông báo. Vì vậy, chỉ cần thực hiện một dịch vụ mà cố gắng để đăng nhập và được đăng ký như là một máy thu phát sóng cho các thay đổi mạng. Sau đó, khi dịch vụ đến một sự kiện mà nó cần phải thông báo cho người dùng bật lên một thông báo trên thanh thông báo của anh ta. Xem liên kết này để biết thêm thông tin về các thông báo http://developer.android.com/guide/topics/ui/notifiers/notifications.html – MikeIsrael

+0

@Mikelsrael yeah ok..Nhưng Ai sẽ đóng vai trò là Người điều khiển .. – NitZRobotKoder

0

Nếu bạn đăng nhập, hãy sử dụng quá lâu [AccountManager][1] và chỉ thực hiện một lần. Ý tưởng đằng sau mã thông báo AccountManager hoặc bất kỳ thông tin đăng nhập nào bạn cần sử dụng trong Service.

Trong trường hợp cụ thể của bạn, tôi nghĩ cách tốt nhất để giao tiếp Activity của bạn với Service là ràng buộc với nó.

0

Nguồn kiến ​​thức tốt nhất về việc sử dụng cơ bản ServiceSDK. Dài câu chuyện ngắn AIDL được sử dụng cho truyền thông IPC và miễn là bạn chạy dịch vụ trong cùng một quá trình bạn không cần nó. Tôi giả sử bạn có hai lựa chọn:

  1. Nếu điều duy nhất bạn cần là chỉ cần đăng nhập, bạn có thể bắt đầu một dịch vụ khi khởi động lên, đăng nhập và sau đó tức là gửi truyền phát hấp dẫn với dữ liệu đăng nhập kèm mà sau đó sẽ được nhận trong ứng dụng. Xem this question để có một số cách tốt để bắt đầu dịch vụ khi khởi động.

    @Override 
    public void onCreate() { 
        Data data = performLogin(); 
        Intent i = new Intent(ACTION_VOIP_LOGIN); 
        i.putExtra(EXTRA_LOGIN_DATA, data); 
        mContext.sendStickyBroadcast(i); 
    } 
    
    ... 
    
    private final class LoginReceiver extends BroadcastReceiver { 
        @Override 
        public void onReceive(Context context, Intent intent) { 
         // You may use a Bundle instead 
         Data data = intent.getParcelableExtra(); 
         processLoginData(data) 
        } 
    } 
    
    protected void onCreate(Bundle savedInstanceState) { 
        ... 
        IntentFilter filter = new IntentFilter(ACTION_VOIP_LOGIN); 
        mContext.registerReceiver(new LoginReceiver(), filter); 
    } 
    
  2. Trong trường hợp thứ hai, bạn có thể muốn chuyển tất cả logic của mình sang dịch vụ. Tại đây bạn sẽ mở rộng lớp Binder. Xem chi tiết này SDK article để biết chi tiết.

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