0

Heute stoße ich auf ein Problem mit den gemeinsamen Dateninterfaces. Ich deklariere die MainActivity für die Ausführung in einem anderen Prozess und schreibe die gemeinsam genutzten Daten in TestApplication auf 1 und starte dann die SubActivity, um die freigegebenen Daten anzuzeigen. Leider ist der in SubActivity angezeigte Wert immer noch 0, daher haben wir die Schlussfolgerung, dass zwei TestApplication-Instanzen in zwei Prozessen gefüllt werden und das Lesen und Schreiben von gemeinsam genutzten Daten unabhängig voneinander ist. Tatsächlich wurden die geteilten Daten nicht mehr zwischen den Prozessen geteilt. Meine Frage ist, was ist der andere Unterschied zwischen einer Aktivität, die in einem neuen Prozess beginnt, und der ursprünglichen, wie etwa der Erinnerung? Hier sind meine Codes:Was ist der Unterschied zwischen einem Aktivitätsstart in einem neuen Prozess und dem ursprünglichen Prozess?

<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

Warum führen Sie MainActivity in einem anderen Prozess? –

+0

Es gibt einen Dienst im Hintergrund ausgeführt in meinem Projekt, die 7M Speicher verbrauchen, wird der Speicher auf 50M nach dem Start einer Aktivität in meinem Projekt erhöhen und auf 20M nach dem Ende anstatt der origanl 7M verringern. Als Ergebnis davon wird meine Lösung die Aktivität im neuen Prozess starten k Bilde den neuen Prozess ab, sobald die Aktivität beendet wird, um den Speicher zurückzufordern. – Saint

+0

Ihre Lösung ist schlecht. Sie haben ein Speicherleck. Sie müssen herausfinden, warum Sie 13 MB Arbeitsspeicher verlieren. Ihre Lösung ist ein Pflaster. Es wäre besser, das Problem zu finden und zu beheben. Es gibt viele Tools, um Speicherlecks zu finden. –

Antwort

2

Wenn Sie 2 Aktivitäten in verschiedenen Prozessen ausgeführt haben, teilen sie nichts. Android startet 2 verschiedene native OS-Prozesse. Jeder Prozess hat seinen eigenen Speicher und seine eigene Dalvik VM.

Wenn Sie in Ihrem Manifest eine benutzerdefinierte Application Klasse angeben (die Sie in Ihrem Beispiel mit TestApplication gemacht haben, erstellt Android eine neue Instanz dieser Klasse, wenn es einen neuen Betriebssystemprozess für Ihre App erstellt. In Ihrem Fall Wenn Sie 2 Aktivitäten in 2 separaten Prozessen ausführen, dann haben Sie 2 Instanzen von TestApplication, eine in jedem OS-Prozess.

Verwandte Themen