0

Aujourd'hui, je rencontre un problème de taille concernant les inter-processus de données partagées. Je déclare MainActivity pour s'exécuter dans un autre processus et écris les données partagées dans TestApplication à 1, puis démarre la SubActivity pour afficher les données partagées. Malheureusement, la valeur affichée dans SubActivity est toujours 0, par conséquent, nous avons la conclusion qu'il existe deux instances de TestApplication remplies dans deux processus, et que la lecture et l'écriture des données partagées sont indépendantes les unes des autres. en fait, les données partagées ne sont plus partagées entre processus. Ma question est la suivante: quelle est l'autre différence entre une activité qui commence dans un nouveau processus et l'autre, comme la mémoire? Voici mes codes:Quelle est la différence entre un début d'activité dans un nouveau processus et celui d'origine

<application 
     android:name=".TestApplication" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
<activity android:name=".MainActivity" 
      android:process="com.rlk.miaoxinli.hellokitty" 
      > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".SubActivity"> 

     </activity> 
    </application> 


public class TestApplication extends Application { 

    public int mValue = 0; 
} 


public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

    private TextView mTextView; 
    private TestApplication mApplication; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mApplication = (TestApplication) getApplication(); 

     setContentView(R.layout.activity_main); 
     mTextView = (TextView)findViewById(R.id.first); 
     mApplication.mValue = 1; 

     mTextView.setClickable(true); 
     mTextView.setOnClickListener(this); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mTextView.setText("" + mApplication.mValue); 
    } 

    @Override 
    public void onClick(View view) { 
     Intent intent = new Intent(this, SubActivity.class); 
     startActivity(intent); 
    } 
} 



public class SubActivity extends AppCompatActivity { 

    private TextView mTextView; 
    private TestApplication mApplication; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_sub); 
     mTextView = (TextView) findViewById(R.id.second);; 
    } 
} 
+0

Pourquoi exécutez-vous 'MainActivity' dans un processus différent? –

+0

Un service s'exécute en arrière-plan Dans mon projet, qui consomme 7M de mémoire, la mémoire passera à 50M après le démarrage d'une activité dans mon projet et diminuera à 20M après la fin plutôt que l'origanl 7M.A cause de cela, ma solution est de commencer l'activité dans un nouveau processus et k Mal le nouveau processus une fois l'activité sortie pour récupérer la mémoire. – Saint

+0

Votre solution est mauvaise. Vous avez une fuite de mémoire. Vous devez savoir pourquoi vous perdez 13 Mo de mémoire. Votre solution est un pansement. Il vaudrait mieux trouver et résoudre le problème. Il y a beaucoup d'outils pour aider à trouver des fuites de mémoire. –

Répondre

2

Si vous avez 2 activités exécutées dans différents processus, elles ne partagent rien. Android démarre 2 processus d'OS natifs différents. Chaque processus a sa propre mémoire et sa propre machine virtuelle Dalvik.

Dans votre manifeste, si vous fournissez une classe personnalisée Application (ce que vous avez fait dans votre exemple avec TestApplication, Android créera une nouvelle instance de cette classe chaque fois qu'il créera un nouveau processus de système d'exploitation pour votre application. Si vous avez 2 activités exécutées dans 2 processus distincts, alors vous aurez 2 instances de TestApplication, une dans chaque processus OS