2012-09-26 15 views
5

Tôi gặp sự cố với hai hoạt động mà tôi không thể giải quyết:Hoạt động được khởi chạy từ thiết bị phát sóng, giữ trong các tác vụ gần đây mặc dù đã hoàn thành

Tôi có một hoạt động báo thức bằng báo thức người quản lý, trong 3 giây, người nhận báo thức sẽ khởi chạy hoạt động B chỉ có nút kết thúc.

Nếu tôi lập trình trình quản lý cảnh báo từ A và kết thúc hoạt động này, nhấn nút quay lại, trong 3 giây hoạt động B sẽ xuất hiện. Tất cả đều bình thường. Vấn đề là như sau: nếu tôi mở lại ứng dụng bằng trình khởi chạy, hệ thống khởi động một hoạt động, nhưng nếu tôi khởi động ứng dụng bằng cách nhấn và giữ nút Home (các tác vụ được sử dụng gần đây), tôi luôn mở hoạt động B. Tôi cần khi tôi hoàn thành hoạt động B, nếu tôi mở lại ứng dụng từ bất cứ đâu, hoạt động A sẽ mở.

Tôi đã cố gắng thêm noHistory vào hoạt động B, nhưng vấn đề vẫn tiếp tục.

Đây là mã của A hoạt động:

public class ActivityA extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_a); 

    Button b=(Button) findViewById(R.id.initTimer); 
    b.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      programTimer(); 
     } 
    }); 
} 

private void programTimer() { 
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(this, AlarmReciver.class); 
    PendingIntent pIntent = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
    manager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+3000 , pIntent); 
} 

}

B hoạt động:

public class ActivityB extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_b); 

    Button button= (Button) findViewById(R.id.bFinish); 
    button.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      finish(); 
     } 
    }); 
} 

}

AlarmReciver:

public class AlarmReciver extends android.content.BroadcastReceiver { 
private static final String DEBUG_TAG="ReceptorAlarma"; 
@Override 
public void onReceive(Context context, android.content.Intent intent) {  
    //lanzar activity 
    Intent i = new Intent(context, ActivityB.class); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i);  
} 

}

Manifest:

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".ActivityA" 
     android:label="@string/title_activity_activity" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <activity android:name=".ActivityB">    
    </activity> 

    <receiver android:name=".AlarmReciver" > 
    </receiver> 
</application> 

nhờ thời gian của bạn.

Trả lời

1

Bạn đã viết:

Nếu tôi chương trình quản lý báo động từ A và kết thúc hoạt động này nhấn nút quay lại, trong 3 giây hoạt động B xuất hiện. Tất cả đều bình thường.

Lưu ý: Bây giờ bạn có 1 nhiệm vụ đang chạy có ActivityB làm hoạt động gốc.

Vấn đề là như sau: nếu tôi mở lại ứng dụng bằng các phóng, hệ thống khởi động Hoạt động,

Lưu ý: Khi bạn khởi động ứng dụng từ trình chạy, điều này bắt đầu một nhiệm vụ khác với ActivityA là hoạt động gốc của nó. Bây giờ bạn có 2 nhiệm vụ chạy: một với ActivityA như là người chủ và một với ActivityB

... nhưng nếu tôi khởi động ứng dụng bằng cách nhấn lâu vào nút nhà (sử dụng gần đây nhiệm vụ) Tôi luôn luôn mở hoạt động B .

Lưu ý: Khi dài nhấn nút HOME và chọn từ các tác vụ sử dụng gần đây, bạn đang lựa chọn các nhiệm vụ đã được bắt đầu bởi AlarmReciver trong đó có ActivityB như là người chủ của nó

Tôi cần điều đó khi Tôi kết thúc hoạt động B, nếu tôi mở lại ứng dụng từ bất cứ đâu, hoạt động A sẽ mở.

Bạn sẽ có thể để có được hành vi mà bạn muốn bằng cách thiết lập sau trong thẻ <activity> cho ActivityB:

android:excludeFromRecents="true" 

Điều này sẽ đảm bảo rằng, khi bạn bắt đầu một nhiệm vụ với ActivityB như hoạt động gốc của nó , nhiệm vụ sẽ không phải được hiển thị trong danh sách các tác vụ gần đây. Bằng cách này, cách duy nhất để khởi chạy ứng dụng sẽ là từ màn hình HOME hoặc bằng cách chọn nó từ danh sách các nhiệm vụ gần đây (sẽ giữ chỉ tác vụ được bắt đầu bằng ActivityA làm gốc).