2013-04-11 2 views
0

처음으로 포스터를 보내주십시오. 오랜 시간 내 게시물을 남겨주세요. 필요한 모든 정보를 제공하고 싶습니다.android 알림은 항상 활동을 다시 시작합니다.

내가이 기능을 사용하려면 알림 기능을 클릭하는 것이 좋습니다. 그러나 몇 가지 어려움이 있습니다. 첫째, 세부 사항 (아래 코드) OFF : MyApp를는 startService를 통해 MyAppService을 시작

Android Developer Tools Build: v21.1.0-569685 
Project Build Target : 4.2.2 
Platofrm : 4.2.2 
API Level : 17 
SDK Target : 17 
SDK min : 14 

Android Device Chooser : Android Device : Nexus 4 
    1. 프로젝트 속성

    2. 이 MyAppService의 onStartCommand 기능에 객체 NotificationCompat.Builder 사용 풀다운 알림에 막대를 만듭니다.

    행동은 내가 달성하기 위해 노력하고 있어요 :

    1. 시작 알림 표시 줄 항목 (예 : 메일)
    2. 시작 MyApp를 (이것은 또한 MyAppService를 시작합니다)와 응용 프로그램이
    3. 아래로 당겨 알림 바를 선택하고 MyAppService를 선택하십시오. (예, MyApp가 현재 화면에 있습니다.
    4. 알림 표시 줄은 아무것도하지 않고 롤업해야합니다.

    내가 알아 차리는 것은 MyApp가 최소화되고 MyApp의 새로운 인스턴스가 최대화되는 것입니다 (앱이 시작될 때와 유사한 전환). 메일 응용 프로그램을 맨 위에 놓을 때 MyAppService를 선택하면이 동작이 일어날 것으로 예상됩니다 (최소화하려면 메일 응용 프로그램을, 최대화하려면 MyApp).

    많은 코드 스 니펫과 제안이 있었지만 제대로 작동하지 않는 것 같습니다. 그래서 여기에 내 파일의 내용은 다음과 같습니다

    의 AndroidManifest.xml은

    <application 
        android:allowBackup="true" 
        android:icon="@drawable/eyeview" 
        android:label="@string/app_name" 
        android:theme="@style/AppTheme" > 
    
        <activity 
         android:name="com.example.MyApp.MainActivity" 
         android:label="@string/app_name" 
         android:launchMode="singleTop" 
         > 
         <intent-filter> 
          <action android:name="android.intent.action.MAIN" /> 
          <category android:name="android.intent.category.LAUNCHER" /> 
         </intent-filter> 
        </activity> 
    
        <service 
         android:name=".service.MyAppService" 
         android:label="MyAppService"> 
        </service> 
    </application> 
    

    의 MyApp/MainActivity.java

    public static Intent serviceIntent; 
    public static Messenger clientMessenger; 
    
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstance); 
    
        if (getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) 
        { 
         finish(); 
         return; 
        } 
    
        setContentView(R.layout.activity_main); 
    
        ... 
        [stuff specific to app, like setting up Fragments] 
        ... 
    
        MainActivity.serviceIntent = new Intent(this, MyAppService.class); 
        MainActivity.serviceIntent.putExtra("clientMessenger", clientMessenger); 
        startService(MainActivity.serviceIntent); 
    } 
    

    MyAppService.java

    @Override 
    private int onStartCommand(Intent intent, int flags, int startId) 
    { 
        NotificationCompat.Builder ncB = new NotificationCompat.Builder(getApplicationContext()) 
         .setSmallIcon(R.drawable.icon_app) 
         .setContentTitle("MyAppService") 
         .setSmallIcon(R.drawable.app); 
    
        ncB.setContentText("Click to start MyApp"); 
    
        Intent nIntent = new Intent(getApplicationContext(), MainActivity.class); 
        nIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
        nIntent.setAction(Intent.ACTION_MAIN); 
    
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(getApplicationContext()); 
        stackBuilder.addNextIntent(nIntent); 
        PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
    
        notificationBuilder.setContentIntent(resultPendingIntent); 
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    
        int nId = 1; 
        Notification notification = ncB.build(); 
        notification.flags = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR; 
    
        notificationManager.notify(nId, notification); 
    
        sendMessengerToClient(intent); 
    
        startForeground(nId, ncB.build()); 
    
        return Service.START_NOT_STICKY; 
    } 
    

    나는 모두 포함 희망 충분한 정보 -이 코드가 작동하는지 알아보기 위해 코드를 수정했습니다. - 모든 cas에서 e, 최상위 애플리케이션이 검은 색 화면을 최소화하고 MyApp가 최대화하고 MainActivity.java의 onCreate 함수가 호출됩니다.

    MyApp가 이미 최상위에있는 경우 알림 풀다운 만 스크롤하면됩니다.

    미리 감사드립니다. 당신은 내가 추측이 달성 할 수 PendingIntent.FLAG_UPDATE_CURRENTIntent.FLAG_ACTIVITY_SINGLE_TOP 플래그를 설정하여

  • +0

    최상위 활동 인 경우 자신의 앱에 대한 알림을받는 것이 좋습니다. 알림은 앱 앞에 다른 것이있을 때 앱과 관련된 정보를 사용자에게 알리기위한 것입니다. 그 활동이 위에있을 때 앱에 대한 알림을 취소하는 것이 좋습니다. – dsandler

    +0

    아, 또한'startForeground()'도 사용하고 있다면'notify()'를 호출 할 필요가 없습니다. 후자의 전화는 통지를 게시 할 것입니다. – dsandler

    +0

    안녕하세요 @dsandler, 알림은 실제로'MyAppService.java'에 의해 유지됩니다. 이것은'MyApp'가 시작될 때 시작되는 서비스입니다. – Mark

    답변

    4
    Intent notificationIntent = new Intent(this, MainActivity.class); 
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, 
        notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    mBuilder.setContentIntent(pendingIntent); 
    

    . 이미 실행중인 경우 활동을 작성하지 않습니다.

    +0

    이 대답은 나를 위해 완벽하게 작동합니다. 덕분에 –

    +0

    여기까지 좋습니다. – Shashika

    2

    내 경우에는 대답이 Shashika에 의해 작동하지만 이상한 방식으로했습니다.나는 전화를 다시 시작해야했다! :)